libc中的静态内联函数

时间:2013-07-17 10:37:31

标签: c gcc libc

我在static inline Bioniclibc)中找到stdlib.h函数。

我想编译一个文件而不包括stdlib.h

例如: 测试文件:

extern int test(void)
void foo() {
    int a = test();
}

int main() {
    foo ();
    return 0;
}

为什么我需要包含头文件以使用定义为static inline的函数?

3 个答案:

答案 0 :(得分:1)

来自Using the GNU compiler

  

当函数既是内联函数又是静态函数时,如果对函数的所有调用都集成到调用者中,并且从不使用函数的地址,则永远不会引用函数自己的汇编代码。 在这种情况下,除非指定选项-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标准文档。