c++ - 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
解决方案
警告不是标准化语言的一部分,而是您的编译器供应商从他们的专家角度对哪些事情容易出错的提示。他们警告说他们检测到了一个可能的问题,但即使您知道自己没事,最好还是更改您的代码以免导致问题。
你是对的,这是一个不一致的地方,但是隐藏具有范围本地名称的变量会导致许多错误。有些人在被捕之前造成的损失代价高昂。如果这个警告有助于防止错误,那么这是一个胜利。可能是实现函数警告的代码与对命名空间范围变量进行静态分析的代码的逻辑路径不同,这只是一个疏忽。
为了解决这个问题,从最好到最坏的方法:
好:没有全局(或嵌套的命名空间范围)变量。
好:选择非隐藏的局部变量名。
坏:禁用警告。
可怕:忽略编译器输出并假装它不存在
#3 之所以不好,是因为警告存在的原因:它可能是一个问题,而且从历史上看,对于其他人来说已经有足够的时间了,值得在它也成为你的问题之前警告你。从别人的错误中受益,而不必先经历痛苦,相信它通常是一个错误。
忽略编译器输出是可怕的,因为它会训练人们不阅读编译器输出,并且可能会在警告中发出一些真正的错误。认真对待每一个,不要让它们存在于你的代码中。每当它发出警告时,在修复它之前也要仔细考虑。您可能“接近”了一个错误,快速更改可能会掩盖它而不是修复它。
推荐阅读
- python-3.x - 芹菜_1 | ImportError:没有名为“hh_ru_django”的模块
- here-api - 如何在 Here iOS SDK 高级版的 API 文档中进行文本搜索?
- reactjs - 我无法从终端创建新的 React 应用程序
- css - 绝对位置隐藏内容
- typescript - 用于排序数组的通用函数
- azure - 从 Visual Studio (NuGet) 连接到 Azure DevOps 工件
- c# - DataAdapter.Fill 返回行数,但 Rows.List 为空
- php - 允许一起应用一些设置为“个人使用”的 WooCommerce 优惠券
- linux - 当月份的日期在 10 号之前时,无法设置 unix 时间戳值
- python-3.x - 如何使用 fastapi 日志记录捕获 X-Forwarded-For?