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