导致 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
?
我可以确认匿名命名空间没有任何影响 - 仍然会发出警告。我将inline
in 放入并查看 asm 看看会发生什么
在 objdump 和 otool 玩过之后,我可以确认 static inline void __attribute__((noinline))
不会使用 clang -O3
或 g++ -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 警告的静态非内联函数的主要内容,如果未能解决你的问题,请参考以下文章