4

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

namespace
{
    void unusedFunction1()
    {
    }
}

static void unusedFunction2()
{
}

使用 /Wall,编译器会报告

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

对于静态函数 usedFunction2()。但它不报告未使用的Function1() 的任何内容。

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

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

4

1 回答 1

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))

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

于 2014-12-15T13:03:02.413 回答