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

How to generate warning for unreferenced local function in anonymous namespace?

本文关键字:函数 警告 引用 命名空间      更新时间:2023-10-16

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

namespace
{
    void unusedFunction1()
    {
    }
}
static void unusedFunction2()
{
}

使用/Wall,编译器报告

警告 C4505:"未使用的函数 2":未引用的本地函数具有 已被移除

对于静态函数 unusedFunction2()。但它没有报告未使用的函数 1() 的任何内容。

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

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

根据您正在阅读的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))

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