C++ 导致clang发出Wunneeded内部声明警告的静态非内联函数

C++ 导致clang发出Wunneeded内部声明警告的静态非内联函数,c++,function,static,header,clang,C++,Function,Static,Header,Clang,我有一个头文件,它有许多静态函数来包装东西 namespace jhelper { static void __attribute__((noinline)) writerKey(rapidjson_writer * writer, const char * key) { writer->Key(key); } } 为什么??因为writer->Key()writerKey用于模板化函数中,如果未包装writer->Key()(和类似函数),则可执行文件的大小会增加几兆字节 gcc对此

我有一个头文件,它有许多静态函数来包装东西

namespace jhelper {
static void  __attribute__((noinline)) writerKey(rapidjson_writer * writer, const char * key)
{ writer->Key(key); }
}
为什么??因为
writer->Key()
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]

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

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

在添加属性以避免内联时,不应使用内联

你可以

static inline void\uuuuu属性(noinline))
writerKey(rapidjson_writer*writer,const char*key)
{
编写器->键(键);
}

静态内联无效属性((noinline))writerKey(/*..*/)
是否解决了您的问题,因为
内联
现在与内联无关。或者未命名的命名空间而不是
静态
?我可以确认匿名命名空间没有任何影响-仍然发出警告。我将把
inline
放进去,看看asm,看看发生了什么在使用objdump和otool玩了一些之后,我可以确认
static inline void\uu属性((noinline))
没有使用
clang-O3
g++-O3
内联函数。如果你把它作为一个答案发布,我会接受。当你有警告问题时,你应该发布你正在使用的编译器版本和编译器标志集。我试着用叮当声和-Wall-Weverything重现这一点,但没有生成任何警告。