导致 clang 发出 Wunneeded-internal-declaration 警告的静态非内联函数

Posted

技术标签:

【中文标题】导致 clang 发出 Wunneeded-internal-declaration 警告的静态非内联函数【英文标题】:static non-inline functions causing clang to emit Wunneeded-internal-declaration warnings 【发布时间】: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 重现此问题,但没有生成警告。 【参考方案1】:

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

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

你可能会这样做

static inline void __attribute__((noinline))
writerKey(rapidjson_writer* writer, const char* key)

    writer->Key(key);

【讨论】:

以上是关于导致 clang 发出 Wunneeded-internal-declaration 警告的静态非内联函数的主要内容,如果未能解决你的问题,请参考以下文章

带有“#”的 Clang 诊断标志会导致构建错误

clang 忽略属性 noinline

在 Mac OS 10.13.15 上安装 MySQL-python 导致命令“clang”失败,退出状态为 1

clang 将元数据设置为 allocainst

禁止 Clang 格式与评论混淆

快速数学导致对“__pow_finite”的未定义引用