C和C++中inline-keyword的区别

ead*_*ead 6 c c++ language-lawyer

考虑以下带有inline-function 的C++ 代码:

// this function is in a header-file:
// recursion prevents inlining
inline int calc(int k){
    if(k<=1) return 1;
    return calc(k-1)+calc(k-2);
}

// this function is in a source-file:
int fun(int k){
    return calc(k);
}
Run Code Online (Sandbox Code Playgroud)

这里我使用递归来模拟编译器无法内联函数的情况calc

生成的程序集(使用 编译-Os,请参阅https://godbolt.org/ 上的直播):

...
        .weak   calc(int)
        .type   calc(int), @function
calc(int):
    // some assembler


       .text
        .globl  fun(int)
        .type   fun(int), @function
fun(int):
...
        jmp     calc(int)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,编译器无法内联calc,因此为它发出了代码,但由于inline-keyword 它变成了一个弱符号。

编译与 C 相同的代码,会产生不同的结果(使用-Os,see live on https://godbolt.org/):

.Ltext0:
        .globl  fun
        .type   fun, @function
fun:
...
        jmp     calc
Run Code Online (Sandbox Code Playgroud)

最显着的区别:没有为 发出代码calc,因此基本上链接器将无法链接可执行文件,因为calc缺少的定义。

显然,inline与 C++ 相比,在 C 中意味着不同的东西。

inline与 C++ 相比,C 中有什么区别?calc应该如何定义,它可以同时在 C 和 C++ 的头文件中使用?