C和C++中inline-keyword的区别
考虑以下带有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);
}
这里我使用递归来模拟编译器无法内联函数的情况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)
正如预期的那样,编译器无法内联calc,因此为它发出了代码,但由于inline-keyword 它变成了一个弱符号。
编译与 C 相同的代码,会产生不同的结果(使用-Os,see live on https://godbolt.org/):
.Ltext0:
.globl fun
.type fun, @function
fun:
...
jmp calc
最显着的区别:没有为 发出代码calc,因此基本上链接器将无法链接可执行文件,因为calc缺少的定义。
显然,inline与 C++ 相比,在 C 中意味着不同的东西。
inline与 C++ 相比,C 中有什么区别?calc应该如何定义,它可以同时在 C 和 C++ 的头文件中使用?