我已经读了here本:
上面写道:
用内联方式定义的函数.始终发出独立的目标代码.在整个程序中,您只能编写一个这样的定义.如果要将它从其他翻译单元使用到定义它的翻译单元,您可以在头文件中放置一个声明;但它不会内联在这些翻译单元中.
然而,在我的最小可重现示例中:
Test.c
inline
int foo(void)
{
return 0;
}
int main(void)
{
foo();
}
收纳
cc -std=c99 -Wall -Wextra -Wshadow -Wpedantic Test.c -o test
Undefined symbols for architecture x86_64:
"_foo", referenced from:
_main in test-febb67.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:4: test] Error 1
因此,代码似乎没有正确发出.同样的问题也出现在gcc
人身上.这里发生什么事情?具体地说,我想知道,这里有什么不同:
这个可以修好它.
inline foo(void) { /* definition */ }
foo(void);
这个可以修好它.
foo(void) { /* definition */ }
inline foo(void);
我的 case 是: 不对.
inline foo(void) { /* definition */ }
我看到here可能是因为它有外部链接,但没有提供外部定义;然而,这只是main
和单个翻译单位(内部)中的引用.这个符号在哪里没有被解析?为什么?一定是main
的电话打来的.
我发现当-O2
打开时,没有问题,这是因为代码不是最初发出的,默认情况下也不是内联的.
This没有回答我的问题.我不是问static inline
修复的问题,只是问为什么它在这个 case 中被区别对待,而不是inline
,这一点我仍然不明白.为什么这总是会导致排放?
我想首先理解为什么this是一个问题,因为我读到它会发出代码.这一点在标准中有明确的体现吗?