首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用-std=gnu99和内联函数时编译错误

使用-std=gnu99和内联函数时编译错误
EN

Stack Overflow用户
提问于 2012-10-05 13:22:30
回答 4查看 7.8K关注 0票数 14

以下代码:

代码语言:javascript
复制
#include <stdio.h>
inline int myfunc (int x) {
    return x+3;
}

int main () {

    printf("%d", myfunc(2));
    return 0;
}

使用-std=gnu99标志时不编译(我正在使用gcc进行编译)。这是它抛出的错误:

代码语言:javascript
复制
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时会抱怨吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-05 15:11:52

在C99中,您需要为内联函数指定一个声明,如

代码语言:javascript
复制
int myfunc(int);

或者允许编译器通过指定-finline-functions-O3来实际内联该函数。

引用C99标准:

任何具有内部链接的函数都可以是内联函数。对于具有外部链接的函数,适用以下限制:如果一个函数是用内联函数说明符声明的,那么它也应该定义在同一个翻译单元中。如果翻译单元中的函数的所有文件范围声明都包含没有extern的内联函数说明符,那么该翻译单元中的定义就是内联定义。内联定义不提供函数的外部定义,也不禁止在另一个翻译单元中进行外部定义。内联定义提供了外部定义的替代方案,译者可以使用该定义来实现对同一翻译单元中的函数的任何调用。对函数的调用是使用内联定义还是使用外部定义.

所以编译器可以自由地使用myfunc的外部定义--如果不提供它,它就不存在,因此出现链接器错误。为什么它更喜欢选择一个不存在的外部定义?因为不使用-finline-functions或包含此标志的优化级别而不允许内联。

票数 8
EN

Stack Overflow用户

发布于 2012-10-05 13:40:41

这是gnu_inline打嗝。使用-std=gnu99 -fgnu89-inline

有关更多信息,请参见功能属性 (项gnu_inline)。

有关段落:

在C中,如果函数既不是外部函数也不是静态函数,那么该函数将被编译为独立函数,并在可能的情况下被内联。 这就是GCC传统上处理内联函数的方式。由于ISO C99为内联指定了不同的语义,因此函数属性作为一种转换度量提供,并作为其本身的一个有用特性提供。此属性可在GCC 4.1.3及以后版本中使用。如果定义了预处理器宏GNUC_GNU_INLINEGNUC_STDC_INLINE,则可用。看内联函数和宏一样快。

票数 5
EN

Stack Overflow用户

发布于 2012-10-05 13:30:35

在定义它之前,你应该声明“myfunc”。例如,可以使用-std=gnu99选项编译此代码:

代码语言:javascript
复制
#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上测试过),在本例中,您的源代码将在编译时不需要额外声明。

更新

在这里您可以找到更深层次的解释:函数

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12747198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档