namespace testn {
int foo;
}
int foo;
int main() {
foo = 5;
return 0;
}
using namespace testn;
在此示例中,放置此 using 指令将导致编译器错误。但是,您可以看到在文件末尾使用 is。似乎无论您将 using 指令放在何处,它都会影响整个作用域和子作用域。但是,我可以在
main()
内但在 foo = 5
之后移动此 using 指令。这样做不影响foo = 5
,也没有报错
全局命名空间似乎有些特殊:它不是按顺序处理的,任何东西都会影响任何其他东西,不管它们被引入的顺序如何。
我是在 MSVC/VS 上做的。此功能是语言标准的一部分还是 MSVC 的工作原理?
更新 2: FXXK ME 它不是 cl.hpp,是这个
opencl.hpp
。
我 100% 确定就是这样。不包括任何其他内容。
将我的代码CL/cl.hpp
更改为“CL/opencl.hpp”。
这是一个干净的新文件,只有这几行。没有其他任何东西。重现完全相同的错误。
除了我提供的例子之外仍然有错误。那个也很干净,不包含任何头文件,只有纯语法测试行。在我的系统上它构建并运行,带有错误消息
'foo' is ambiguous
更新:
注意我用的是VS2022
我提出这个问题是因为我又发生了一个系列问题:
#include <CL/opencl.hpp>
namespace myProj{
int end;
}
using namespace myProj;
int main(){}
cl.hpp
中有这样的东西:param->assign(begin(value), prev(end(value)));
这个放在全局命名空间的using指令,即使在包含
cl.hpp
之后,导致这行代码失败,报错C3861: 'prev' indentifier not found
.
然而只要将这个 using 指令放在 main 中的第一行就会使错误消失。