Inline function linkage

2019-01-05 03:19发布

I can't make sense of the following behavior: one header with some basic types, and another header in which I use these types in several functions. Afterward I started constructing classes based on my defined types and functions. In the function header if I leave the following signature:

void whateverFunction(parameters)

The linker points out that there are multiple definitions of whateverFunction. Now if change it to:

inline void whateverFunction(parameters)

the linkage problem is gone and all compiles and links well. What I know concerning inline is that it replaces every function call with it's code other than that it's a pretty dark, so my question is:

How does the linker treats inline functions in C++?

3条回答
仙女界的扛把子
2楼-- · 2019-01-05 03:44

The linker may not see inline functions at all. They are usually compiled straight into the code that calls them (i.e., the code is used in place of a function call).

If the compiler chooses not to inline the function (since it is merely a hint), I'm not sure, but I think the compiler emits it as a normal non-inline function and somehow annotates it so the linker just picks the first copy it sees and ignores the others.

查看更多
Deceive 欺骗
3楼-- · 2019-01-05 03:57

When the function in the header is not inline, then multiple definitions of this function (e.g. in multiple translation units) is a violation of ODR rules.

Inline functions by default have external linkage. Hence, as a consequence of ODR rules (given below), such multiple definitions (e.g. in multiple translation units) are Okay:

$3.2/5- "There can be more than one definition of a class type (Clause 9), enumeration type (7.2), inline function with external linkage (7.1.2), class template (Clause 14), non-static function template (14.5.6), static data member of a class template (14.5.1.3), member function of a class template (14.5.1.1), or template specialization for which some template parameters are not specified (14.7, 14.5.5) in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then

— each definition of D shall consist of the same sequence of tokens; and [...]

How the linker treats inline functions is a pretty much implementation level detail. Suffice it to know that the implementation accepts such mulitple defintions within the limitations of ODR rules

Note that if the function declaration in header is changed to 'static inline....', then the inline function explicitly has internal linkage and each translation unit has it's own copy of the static inline function.

查看更多
你好瞎i
4楼-- · 2019-01-05 04:08

The inline just masks the problem. Having multiple definition points out a problem somewhere.

Juste be careful about how you use your headers. Dont forget to : - << #ifndef HEADER_NAME / #define HEADER_NAME / #endif >> to avoid multiple inclusion. - Do not use indirect inclusion : if you use a type in a file, add the corresponding header, even if another header in the same file includes it.

查看更多
登录 后发表回答