On Friday 31 October 2025 14:53:33 LIU Hao wrote:
> 在 2025-10-31 08:04, Pali Rohár 写道:
> > I see. I did some experiments and seems that this works in C, but not in 
> > C++.
> > Seems that in C it does not require non-inline definition if the
> > function is not declared with extern. In C when it is declared with
> > extern then it behaves same as in C++ without extern, and the function
> > symbol is not emitted.
> 
> For the differences, see this table:
> (https://github.com/lhmouse/mcfgthread/wiki/Differences-between-GNU,-C99-and-C---%60inline%60)
> 
> ----+-------------------------+---------------------------+-------------------------
> #   | inline type             | Out-of-line definition    | Out-of-line 
> definition
>     |                         | existence                 | linkage
> ----+-------------------------+---------------------------+-------------------------
> 1.1 | C plain GNU inline [1]  | Always                    | External
> 1.2 | GNU static inline       | Only when inlining fails  | Internal
> 1.3 | C GNU extern inline [1] | Never                     |
> 2.1 | C99 plain inline [2]    | Never                     |
> 2.2 | C99 static inline       | Only when inlining fails  | Internal
> 2.3 | C99 extern inline [2]   | Always                    | External
> 3.1 | C++ plain inline [3]    | Only when inlining fails  | External, vague 
> [4]
> 3.2 | C++ static inline       | Only when inlining fails  | Internal
> 3.3 | C++ extern inline [3]   | Only when inlining fails  | External, vague 
> [4]
> ----+-------------------------+---------------------------+-------------------------
> 
> [1] In GNU C, `extern inline` applies only if every declaration has an 
> explicit `extern`.
> [2] In C99, `extern inline` applies if any declaration has an explicit 
> `extern` or has no `inline`.
> [3] In C++ `extern` is implied if static is not specified, except for member 
> functions, apparently.
> [4] These may be emitted as `.weak` symbols on Linux and in `.linkonce` 
> sections on Windows.
> 
> 
> `inline` without `static` is equivalent to `extern inline` in C++ (and
> `extern` has no effect) so I think the phenomena which you see are both 1.3
> in this table.
> 
> Multiple non-vague external definitions will cause linker errors.

That is nice table! And yes, what I saw matches type 1.3.

What would be nice to mention in such table is whether duplicate
definitions are possible and of which types.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to