为什么将 `using namespace` 放在文件末尾也会导致问题?

问题描述 投票:0回答:0
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 中的第一行就会使错误消失。

c++ namespaces
© www.soinside.com 2019 - 2024. All rights reserved.