【问题标题】:static non-inline functions causing clang to emit Wunneeded-internal-declaration warnings导致 clang 发出 Wunneeded-internal-declaration 警告的静态非内联函数
【发布时间】:2020-04-01 09:47:47
【问题描述】:

我有一个头文件,其中包含许多包装事物的静态函数。

namespace jhelper {
static void  __attribute__((noinline)) writerKey(rapidjson_writer * writer, const char * key)
{ writer->Key(key); }
}

为什么?因为writer->Key() 会导致生成大量的asm。 writerKey 用于模板化函数,如果 writer->Key()(和类似函数)没有被包装,我的可执行文件的大小会增加几兆字节。

gcc 可以很好地处理这个问题,但是 clang 喜欢发送以下警告:

jsonVisitor.hpp:368:41: warning: 'static' function 'writerKey' declared in header file should be declared 'static inline' [-Wunneeded-internal-declaration]

我非常明确地不希望这个内联。我不担心存在于单独编译单元中的静态函数的重复副本,因为我正在使用合并版本进行发布。如何抑制此警告?干杯!

【问题讨论】:

  • static inline void __attribute__((noinline)) writerKey(/*..*/) 是否解决了您的问题,因为 inline 现在与内联无关。
  • 或未命名的命名空间而不是static?
  • 我可以确认匿名命名空间没有任何影响 - 仍然会发出警告。我将inlinein 放入并查看 asm 看看会发生什么
  • 在 objdump 和 otool 玩过之后,我可以确认 static inline void __attribute__((noinline)) 不会使用 clang -O3g++ -O3 内联函数。如果您将其发布为答案,我会接受。
  • 当您遇到警告问题时,您应该发布您正在使用的编译器版本和编译器标志集。我尝试使用 clang9 和 -Wall -Weverything 重现此问题,但没有生成警告。

标签: c++ function static header clang


【解决方案1】:

inline 现在与内联无关(主要只是一个提示)。

当你添加属性以避免内联时,你不应该有内联。

你可能会这样做

static inline void __attribute__((noinline))
writerKey(rapidjson_writer* writer, const char* key)
{
    writer->Key(key);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2016-10-19
    • 2016-08-14
    • 2021-11-22
    相关资源
    最近更新 更多