test.cpp
enum {
ERR_FILE_ACCESS = 1,
ERR_WHATEVER
};
enum ERR : unsigned int {
ERR_FILE_ACCESS = 5,
ERR_FILE_FORMAT = 6
};
int main(int, char**)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,重新定义枚举器“ERR_FILE_ACCESS”会失败。但:
test2.cpp
enum {
ERR_FILE_ACCESS = 1,
ERR_FILE_FORMAT,
ERR_WHATEVER
};
namespace Internal {
enum ERR : unsigned int {
ERR_FILE_ACCESS = 5,
ERR_FILE_FORMAT = 6
};
}
using namespace Internal;
int main(int, char**)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
确实编译成功。
我很惊讶/困惑,为什么命名空间 - after using namespace Internal;- 可以防止名称冲突?
为什么命名空间 - after
using namespace Internal;- 可以防止名称冲突?
因为在第二种情况下,枚举器位于不同的命名空间中,并且 using 指令实际上并未将名称添加到它出现的声明性区域(在本示例中是全局范围/命名空间) 。
这可以从using 指令的文档中看出:
using 指令不会将任何名称添加到它出现的声明区域(与 using 声明不同),因此不会阻止声明相同的名称。
这种行为并不危险。只要您不使用“冲突”符号之一(这里是枚举器),一切都很好,但是当您尝试使用其中之一时,您会收到“符号不明确”错误。
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |