0

我在( )中找到static inline了函数。Bionic libcstdlib.h

我想编译一个不包含stdlib.h.

例如:测试文件:

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

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

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

4

3 回答 3

1

使用 GNU 编译器

当一个函数既是内联函数又是静态函数时,如果对函数的所有调用都集成到调用者中,并且从不使用函数的地址,则从不引用函数自己的汇编代码。在这种情况下,GCC 不会实际输出函数的汇编代码,除非您指定选项 -fkeep-inline-functions。一些调用由于各种原因不能被集成(特别是函数定义之前的调用不能被集成,定义中的递归调用也不能被集成)。如果有一个非集成调用,那么该函数像往常一样被编译为汇编代码。如果程序引用它的地址,该函数也必须像往常一样编译,因为它不能被内联。

因此,如果您不包含 stdlib.h,那么链接器就没有代码可以用来链接符号test(),因为实际上没有这样的函数。但是,尽管您的程序将编译并运行,如果test()不是inline,您应该始终包含适当的头文件,因为这允许编译器检查返回值和参数类型。

于 2013-07-17T11:18:05.097 回答
0
extern int test(void);
void foo() {
    int a = test();
}

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

extern 是外部变量,是在任何功能块之外定义的变量。所以,编译器会找到这个函数。如果你不包括这个文件,编译器就找不到它。

于 2013-07-17T10:46:33.090 回答
0

虽然这个问题有一个公认的答案,但我想对该问题提出更多见解并消除更多疑问:-

根据 c99 标准(§6.2.2 #3)

如果对象或函数的文件范围标识符的声明包含存储类说明符static,则该标识符具有内部链接

具有内部链接的功能仅在一个翻译单元内可见。链接器从未听说过那些具有内部链接的函数,因此它对它们一无所知。简而言之,具有内部链接的函数或变量对链接器是不可见的。至此,您一定已经明白为什么我们必须包含头文件了。

不要忘记检查 c 标准文档。

于 2013-07-17T11:51:15.393 回答