这就是为什么在全局命名空间(或任何其他不恰当的范围)中使用指令是一个坏主意的原因。这不仅仅是风格问题。它可以以微妙的方式改变代码的含义。有关这些问题的全面讨论,请参阅此问题。
几乎可以肯定,您的代码使用标准库中的名称而没有限制,并且这些名称也在全局命名空间中声明。因此,删除using namespace std;
会更改那些不合格名称的含义,而不仅仅是使代码无法编译。
这些可能是您代码中的名称;或者它们可能是 C 库函数。许多(尤其是 中的那些<cmath>
)针对各种类型进行了重载,其中 C 库本身仅声明了一个函数。未指定是否将所有这些都转储到全局命名空间以及namespace std
.
例如,您可能有一个函数调用
float angle = whatever;
float sine = sin(angle);
使用using namespace std;
,这将选择float std::sin(float)
您已转储到全局命名空间中的重载。没有它,取决于实现选择对全局命名空间做什么,它可能仍然会调用它;或者它可能double sin(float)
从 C 库中调用;或者它可能无法编译。
在 GCC 的情况下,似乎 C 库函数而不是C++ 重载被转储到全局命名空间中,正如我在回答这个问题时发现的那样。