内联失败:在链接时可以覆盖函数体

时间:2012-11-20 11:36:35

标签: c++ g++

我今天从Ubuntu 12.04升级,我认为g ++ - 4.6到Ubuntu 12.10,g ++ - 4.7.2。在我的代码中,我有一些标记为__attribute__((always_inline))的函数。这样做的原因很简单,分析表明我显着提高了代码的性能。它适用于g ++ 4.6但现在使用g ++ 4.7我收到错误消息:

  

错误:内联调用always_inline时失败'void func_name(args)':函数体可以在链接时被覆盖

我无法分享我的实际代码,我试图将其缩小范围但是当我改变太多时,错误消失了,所以这没有用。我对此错误消息的根本原因感兴趣。

2 个答案:

答案 0 :(得分:15)

我不打算自己回答这个问题,但我在发布后几分钟意外地找到了答案。

此(隐秘)错误消息的原因是该功能未标记为inline,仅__attribute((always_inline))

答案 1 :(得分:0)

对于我们来说,问题在于我们也未能将函数声明为“静态”。 “ 属性((always_inline))”以纯文本形式表示“内联并且从不包含函数体”,错误消息表示“编译器必须包含函数体”。在我们的例子中,由于该函数不是“静态”的,因此需要可供外部参考。