如何为匿名命名空间中未引用的本地函数生成警告?

Wei*_*ang 5 c++ compiler-warnings visual-c++ c++11 visual-c++-2012

使用Visual C++ 2012编译时如下代码:

namespace
{
    void unusedFunction1()
    {
    }
}

static void unusedFunction2()
{
}
Run Code Online (Sandbox Code Playgroud)

使用 /Wall,编译器报告

警告 C4505:“unusedFunction2”:未引用的本地函数已被删除

对于静态函数usedFunction2()。但它没有报告unusedFunction1()的任何内容。

似乎在匿名命名空间中包含本地函数会抑制未引用的本地函数警告,这对我来说是一个意想不到且令人不快的副作用。

是否有任何方法可以使用 MSVC 或其他 C++ 编译器为匿名命名空间中未引用的本地函数生成警告?

Mue*_*ito 3

根据您正在阅读的 C++ 标准,它可能在第 7.3.1 节中包含有关未命名命名空间的注释:

“尽管未命名命名空间中的实体可能具有外部链接,但它们实际上是通过其翻译单元特有的名称进行限定的,因此永远无法从任何其他翻译单元中看到它们。” (例如http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)。

这意味着编译器可以生成具有外部链接的匿名命名空间符号。检查 .obj 文件,这实际上是 MSVC 对“unusedFunction1”所做的事情:

dumpbin /symbols a.obj | findstr "unusedFunction"
1345 00003B20 SECT1B notype ()    External     | ?unusedFunction1@?A0xd43c5f4a@@YAXXZ (void __cdecl `anonymous namespace'::unusedFunction1(void))
Run Code Online (Sandbox Code Playgroud)

因为该函数具有外部链接,所以编译器无法知道它是否被另一个编译单元使用,因此不会抛出警告。看来其他编译器在使用内部链接方面做出了更好的选择。