C++ 命名空间警告 - 声明隐藏全局声明 VS 2015 警告 C4459

标签 c++ namespaces

为什么 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

最佳答案

警告不是标准化语言的一部分,而是您的编译器供应商从他们的专家角度给出的关于容易出错的提示。他们警告说他们检测到了一个可能的问题,但即使您知道自己没问题,最好还是更改您的代码以免导致这些问题。
您是对的,这是不一致的,但是隐藏具有范围本地名称的变量会导致许多错误。有些在被捕获之前造成的损害代价高昂。如果这个警告有助于防止错误,那么它就是一个胜利。可能是实现函数警告的代码与对命名空间范围变量进行静态分析的代码是不同的逻辑路径,这只是一个疏忽。
为了解决这个问题,从最好到最坏的方式:

  • 好:没有全局(或嵌套的命名空间范围)变量。
  • 好:选择非隐藏的局部变量名称。
  • 坏:禁用警告。
  • 可怕:忽略编译器输出并假装它不存在

  • #3 之所以不好,是因为警告根本存在的原因:它可能是一个问题,而且从历史上看,对其他人来说已经足够多的时间了,值得在它成为您的问题之前警告您。通过相信它通常是一个错误,从他人的错误中受益,而不必先经历痛苦。
    忽略编译器输出是可怕的,因为它训练人们不阅读编译器输出,并且可能会在警告中发出一些真正的错误。认真对待每一个,不要让它们存在于你的代码中。每当它发出警告时,在修复它之前也要仔细考虑。您可能“接近”了一个错误,快速更改可能会掩盖它而不是修复它。

    关于C++ 命名空间警告 - 声明隐藏全局声明 VS 2015 警告 C4459,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66927549/

    相关文章:

    c++ - Postgres 是否因为 C 的限制而使用内存上下文?

    C++ 用单个值填充空缓冲区

    java - 如何获取 android 命名空间中的所有类?

    c++ - 有限大小的队列

    c++ - 我应该多久重新播种一次 C++?

    c++ - 对std::vector的emplace_back感到困惑

    c# - 在两个命名空间中使用相同的类名 - 优先考虑其中之一

    c++ - 如何布局C++代码: namespaces and similar file names in visual studio 2010

    php - 将对象实例化为具有命名空间的类

    c++ - 名称查找失败 - C++ 命名空间