Compiling error when -std=gnu99 and inline function is used

后端 未结 4 1362
轻奢々
轻奢々 2021-02-19 06:43

The following code:

#include 
inline int myfunc (int x) {
    return x+3;
}

int main () {

    printf(\"%d\", myfunc(2));
    return 0;
}
         


        
4条回答
  •  死守一世寂寞
    2021-02-19 06:51

    In C99 you need to specify either a declaration to your inline function like

    int myfunc(int);
    

    or allow the compiler to actually inline the function by specifying -finline-functions or -O3.

    Quoting the C99 standard:

    Any function with internal linkage can be an inline function. For a function with external linkage, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition. An inline definition does not provide an external definition for the function, and does not forbid an external definition in another translation unit. An inline definition provides an alternative to an external definition, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition or the external definition.

    So the compiler is free to use the external definition of myfunc - which doesn't exist if you don't provide it, hence the linker error. Why does it prefer to choose a non existing external definition? Because you disallowed inlining by not using -finline-functions or a optimization level which contains this flag.

提交回复
热议问题