C++命名空间疑问:为何代码输出为0 1 0而非预期的0 1 2?
问题原因解析
你遇到的问题核心是C++的名字查找优先级规则:当作用域中存在同名的局部变量时,它的优先级会高于通过using namespace引入的命名空间成员。
拆解你的代码执行逻辑:
- 第一个
std::cout << x:直接调用main函数内定义的局部变量x=0,输出0,符合预期。 - 第二个
std::cout << first::x:通过命名空间限定符明确指定调用first命名空间中的x,输出1,无问题。 - 第三个
std::cout << x:虽然你用using namespace second;引入了second命名空间,但main函数的局部作用域中已经存在x,编译器会优先选择局部作用域的变量,因此输出的还是局部的x=0,而非second::x=2。
如果想要得到预期的2,可以直接通过命名空间限定符指定:
std::cout << second::x << std::endl;
或者修改局部变量的名字,避免和命名空间中的变量冲突。
内容的提问来源于stack exchange,提问作者Ryujin
相关产品推荐
相关产品推荐

