首页 > 解决方案 > C++ 命名空间警告 - 声明隐藏全局声明 VS 2015 警告 C4459

问题描述

为什么 C++ 命名空间会抱怨以下代码?

我认为命名空间内的所有内容都会受到外部变量的保护?

生成 C4459 警告

int foo = 0;

namespace ns_protected {

  void function ()
  {
    int foo; //Generates C4459 Warning declaration of foo hides global declaration 
  }

}//end ns_protected

下面的代码没有警告如果我删除该功能

int foo = 0;

namespace ns_protected {

  int foo; //NO C4459 Warning Generated by VS 2015 C++
  

}//end ns_protected

标签: c++namespaces

解决方案


警告不是标准化语言的一部分,而是您的编译器供应商从他们的专家角度对哪些事情容易出错的提示。他们警告说他们检测到了一个可能的问题,但即使您知道自己没事,最好还是更改您的代码以免导致问题。

你是对的,这是一个不一致的地方,但是隐藏具有范围本地名称的变量会导致许多错误。有些人在被捕之前造成的损失代价高昂。如果这个警告有助于防止错误,那么这是一个胜利。可能是实现函数警告的代码与对命名空间范围变量进行静态分析的代码的逻辑路径不同,这只是一个疏忽。

为了解决这个问题,从最好到最坏的方法:

  1. 好:没有全局(或嵌套的命名空间范围)变量。

  2. 好:选择非隐藏的局部变量名。

  3. 坏:禁用警告。

  4. 可怕:忽略编译器输出并假装它不存在

#3 之所以不好,是因为警告存在的原因:它可能是一个问题,而且从历史上看,对于其他人来说已经有足够的时间了,值得在它也成为你的问题之前警告你。从别人的错误中受益,而不必先经历痛苦,相信它通常是一个错误。

忽略编译器输出是可怕的,因为它会训练人们不阅读编译器输出,并且可能会在警告中发出一些真正的错误。认真对待每一个,不要让它们存在于你的代码中。每当它发出警告时,在修复它之前也要仔细考虑。您可能“接近”了一个错误,快速更改可能会掩盖它而不是修复它。


推荐阅读