【问题标题】:How to properly inline and use an inline function in C99, correcting link failure?如何在 C99 中正确内联和使用内联函数,纠正链接故障?
【发布时间】:2011-07-19 04:47:17
【问题描述】:

在以下简化的example.c 文件上执行cc -std=c99 example.c

inline void a()
{
}

int main()
{
   a();

   return 0;
}

得到我:

在函数“main”中:
example.c:(.text+0x7): undefined reference to 'a'
collect2: ld 返回 1 个退出状态

据我了解,这与 C99 标准的要求有关,即在无法内联正文的情况下使用的每个内联非静态函数都需要一个确切的定义?如果是这样,我想我可以用static inline 代替,但我不希望这以后会咬我,那么这里最好的做法是什么?显然,我想坚持 C99 并且我想内联一些函数。 (是的,我知道编译器通常知道要内联什么而不被告知,但我有我的理由)

【问题讨论】:

  • inline 关键字不是您想的那样。充其量只是向编译器暗示此代码可能是内联的候选者。更糟糕的是,它被忽略了。
  • 你的cc可以编译其他文件吗?可能是编译器有问题。
  • 实际上我正在使用'-Winline',所以在我的情况下它不会被忽略。请原谅我没有具体说明这一点,但我不认为有人会评论 inline 在 C 中的含义或对这方面的问题做出反应。在上述大多数其他变体中,您当然是绝对正确的。 @Mihran 不,编译器没有问题。在仔细检查了 C99 规范之后,我将有问题的内联函数指定为 static inline 并且一切正常。我确实想知道我是否在这里采取了正确的步骤......

标签: c inline c99


【解决方案1】:

使用-O2 左右编译时可能不会出现该错误。

内联函数定义应该放在头文件中,extern inline 声明应该放在one编译单元中。做

inline void a(void){
 // empty
}

// in just one .c file
#include "the-file.h"
extern inline void a(void);

顺便说一句,在没有 void 的情况下声明 a 不是原型。

【讨论】:

  • 好的,这很有趣。如果我需要多个翻译单元使用“a”的定义,我将如何进行?
  • @amn,只需将inline 定义 放在头文件中,将extern inline 声明放在其中一个翻译单元中。请注意,您确实需要一个符合 C99 的编译器。较新的 gcc 例如可以。
  • @JensGustedt 每当我发现有人声称这一点时,我都会一直这么说,但源文件也必须包含定义。
  • 对不起,我认为这很明显。请查看我的编辑。
  • 不简单的void a(void); 也可以在.c 文件中使用吗?
【解决方案2】:

没有函数原型,仅此而已,因此推断出函数签名,并且推断错误。添加“无效a();”到文件顶部,一切就绪。

【讨论】:

  • 是的,如果在同一个翻译单元中定义了“a”(我给出的示例就是这种情况),则该方法有效。一旦我尝试“共享”这个内联函数,但是通过将它的定义放入自己的标题中并包含来自两个或多个翻译单元的这个标题,它就不起作用了,我得到了'a'的多重定义错误。 . 什么给了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多