我在( )中找到static inline
了函数。Bionic
libc
stdlib.h
我想编译一个不包含stdlib.h
.
例如:测试文件:
extern int test(void)
void foo() {
int a = test();
}
int main() {
foo ();
return 0;
}
为什么我需要包含头文件来使用定义为的函数static inline
?
当一个函数既是内联函数又是静态函数时,如果对函数的所有调用都集成到调用者中,并且从不使用函数的地址,则从不引用函数自己的汇编代码。在这种情况下,GCC 不会实际输出函数的汇编代码,除非您指定选项 -fkeep-inline-functions。一些调用由于各种原因不能被集成(特别是函数定义之前的调用不能被集成,定义中的递归调用也不能被集成)。如果有一个非集成调用,那么该函数像往常一样被编译为汇编代码。如果程序引用它的地址,该函数也必须像往常一样编译,因为它不能被内联。
因此,如果您不包含 stdlib.h,那么链接器就没有代码可以用来链接符号test()
,因为实际上没有这样的函数。但是,尽管您的程序将编译并运行,如果test()
不是inline
,您应该始终包含适当的头文件,因为这允许编译器检查返回值和参数类型。
extern int test(void);
void foo() {
int a = test();
}
int main() {
foo ();
return 0;
}
extern 是外部变量,是在任何功能块之外定义的变量。所以,编译器会找到这个函数。如果你不包括这个文件,编译器就找不到它。
虽然这个问题有一个公认的答案,但我想对该问题提出更多见解并消除更多疑问:-
根据 c99 标准(§6.2.2 #3)
如果对象或函数的文件范围标识符的声明包含存储类说明符static,则该标识符具有内部链接。
具有内部链接的功能仅在一个翻译单元内可见。链接器从未听说过那些具有内部链接的函数,因此它对它们一无所知。简而言之,具有内部链接的函数或变量对链接器是不可见的。至此,您一定已经明白为什么我们必须包含头文件了。
不要忘记检查 c 标准文档。