如何为匿名命名空间中未引用的本地函数生成警告
How to generate warning for unreferenced local function in anonymous namespace?
使用 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))
由于该函数具有外部链接,因此编译器无法知道它是否被另一个编译单元使用,因此不会引发警告。似乎其他编译器在使用内部链接方面做出了更好的选择。
相关文章:
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- 返回非 void 的函数中没有返回语句警告
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 当 noexcept 函数尝试在 gcc 或 clang 中调用非 noexcept 函数时启用警告
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 如何禁止在 g++ 中使用但从未定义警告的内联函数
- 删除显式默认函数声明时的警告
- C++未使用的变量警告,即使我在函数结束时返回它
- 获取控制权到达非无效函数警告的末尾,尽管我在 th 函数中有返回语句
- 重载虚函数警告
- G++ 排序函数警告
- c++重载了clang发出的虚拟函数警告
- 使用 g++ 编译C++时,"隐藏构造函数"警告是什么意思?
- clang中如何处理全局构造函数警告
- 禁止库标头中内联函数的 Xcode 未使用函数警告的正确方法
- 派生构造函数警告:永远不会被执行