以下代码:
#include <stdio.h>
inline int myfunc (int x) {
return x+3;
}
int main () {
printf("%d", myfunc(2));
return 0;
}使用-std=gnu99标志时不编译(我正在使用gcc进行编译)。这是它抛出的错误:
gcc -std=gnu99 -c main.c -o main.o
gcc -std=gnu99 main.o -o main
main.o: In function `main':
main.c:(.text+0x15): undefined reference to `myfunc'
collect2: ld returned 1 exit status
make: *** [main] Error 1当省略-std=gnu99时,编译就没有问题了。有人知道为什么链接器在使用-std=gnu99时会抱怨吗?
发布于 2012-10-05 15:11:52
在C99中,您需要为内联函数指定一个声明,如
int myfunc(int);或者允许编译器通过指定-finline-functions或-O3来实际内联该函数。
引用C99标准:
任何具有内部链接的函数都可以是内联函数。对于具有外部链接的函数,适用以下限制:如果一个函数是用内联函数说明符声明的,那么它也应该定义在同一个翻译单元中。如果翻译单元中的函数的所有文件范围声明都包含没有extern的内联函数说明符,那么该翻译单元中的定义就是内联定义。内联定义不提供函数的外部定义,也不禁止在另一个翻译单元中进行外部定义。内联定义提供了外部定义的替代方案,译者可以使用该定义来实现对同一翻译单元中的函数的任何调用。对函数的调用是使用内联定义还是使用外部定义.
所以编译器可以自由地使用myfunc的外部定义--如果不提供它,它就不存在,因此出现链接器错误。为什么它更喜欢选择一个不存在的外部定义?因为不使用-finline-functions或包含此标志的优化级别而不允许内联。
发布于 2012-10-05 13:40:41
这是gnu_inline打嗝。使用-std=gnu99 -fgnu89-inline。
有关更多信息,请参见功能属性 (项gnu_inline)。
有关段落:
在C中,如果函数既不是外部函数也不是静态函数,那么该函数将被编译为独立函数,并在可能的情况下被内联。 这就是GCC传统上处理内联函数的方式。由于ISO C99为内联指定了不同的语义,因此函数属性作为一种转换度量提供,并作为其本身的一个有用特性提供。此属性可在GCC 4.1.3及以后版本中使用。如果定义了预处理器宏GNUC_GNU_INLINE或GNUC_STDC_INLINE,则可用。看内联函数和宏一样快。
发布于 2012-10-05 13:30:35
在定义它之前,你应该声明“myfunc”。例如,可以使用-std=gnu99选项编译此代码:
#include <stdio.h>
int myfunc(int);
inline int myfunc (int x) {
return x+3;
}
int main () {
printf("%d", myfunc(2));
return 0;
}更新
实际上,对于C标准内联关键字,只是对C编译器的一个建议。但是编译器可以选择不内联。因此,它可以按自己的方式行事。
在您的示例中,您可以使用函数声明,如我前面所示,或者您可以添加优化标志'-O3' (在linux上测试过),在本例中,您的源代码将在编译时不需要额外声明。
更新
在这里您可以找到更深层次的解释:函数
https://stackoverflow.com/questions/12747198
复制相似问题