可能重复:为什么'使用命名空间std;'被认为是C的坏习惯?
有一天,当我问一个问题,有人回答说如果有人问一个问题,告诉他们正确的做法,而不是 using namespace std; ,我认为这有点奇怪,因为 using namespace std; 更容易,但我想我'm failing right now as I am a '初学者'编码你们知道的更好
using namespace std;
所以我想我的问题是:为什么 std:: 而不是 using namespace std; ?
std::
谢谢 .
来自C FAQ:
我应该在我的代码中使用命名空间std吗?可能不是 . 人们不喜欢一遍又一遍地输入std ::并且他们发现使用命名空间std可以让编译器看到任何std名称,即使是不合格的 . 美中不足的是它让编译器看到任何标准名称,甚至是你没想过的名字 . 换句话说,它可以创建名称冲突和歧义 .
https://isocpp.org/wiki/faq/coding-standards#using-namespace-std
简而言之,您不太可能错误地使用错误的类型或功能,或者命名冲突 . 假设您正在使用自己的数学库和std,并以任意顺序使用它们进行声明 . 现在,他们都定义了功能pow . 你在调用战俘的时候使用哪种战俘?我觉得值得多打字 .
我不知道更有经验的程序员使用显式名称空间的情况,参见例如Do you prefer explicit namespaces or 'using' in C++?
但是请注意,您永远不应该在头文件中导入名称空间,并且在某些情况下,显式名称空间更清晰,例如使用函数 std::min() 和 std::max()
std::min()
std::max()
我认为这是一个偏好的东西 . 有些人喜欢在使用类时看到显式名称空间 . 一个例外是我从不在头文件中使用using namespace std . 因为这可能会意外地改变使用此头文件的类的行为 .
经验丰富的程序员使用任何解决问题的方法,避免出现任何问题 .
因此,出于显而易见的原因,它们避免使用头文件级使用指令 .
他们试图避免在源文件中对名称进行完全限定 . 不足之处在于,如果没有充分理由,在代码较少的情况下编写更多代码并不优雅 . 重点是关闭ADL .
这些好理由是什么?有时您明确要关闭ADL . 有时你想消除歧义 .
以下是可以接受的:1)函数级使用指令和函数实现中的使用声明; 2)源文件中的源文件级使用声明; 3)(有时)源文件级使用指令 .
命名空间是我们变量的附加限定符 . 假设我们在 std 中定义了'string',现在如果我们在 mynamespace 中也定义'string' .
std
mynamespace
现在,如果我在文件的顶部写 using namespace std; ,那么从那里开始,字符串对于编译器来说变得模糊不清 .
然而,人们可以采取中间方法,严格地不在 Headers (.h)文件中使用 using namespace std; ,因为其他人可能想要使用您的类并且可能会发生冲突 . 对于实现(.cxx)文件,如果您确定不会发生任何冲突,则可以小心使用它 .
6 回答
来自C FAQ:
https://isocpp.org/wiki/faq/coding-standards#using-namespace-std
简而言之,您不太可能错误地使用错误的类型或功能,或者命名冲突 . 假设您正在使用自己的数学库和std,并以任意顺序使用它们进行声明 . 现在,他们都定义了功能pow . 你在调用战俘的时候使用哪种战俘?我觉得值得多打字 .
我不知道更有经验的程序员使用显式名称空间的情况,参见例如Do you prefer explicit namespaces or 'using' in C++?
但是请注意,您永远不应该在头文件中导入名称空间,并且在某些情况下,显式名称空间更清晰,例如使用函数
std::min()
和std::max()
我认为这是一个偏好的东西 . 有些人喜欢在使用类时看到显式名称空间 . 一个例外是我从不在头文件中使用using namespace std . 因为这可能会意外地改变使用此头文件的类的行为 .
经验丰富的程序员使用任何解决问题的方法,避免出现任何问题 .
因此,出于显而易见的原因,它们避免使用头文件级使用指令 .
他们试图避免在源文件中对名称进行完全限定 . 不足之处在于,如果没有充分理由,在代码较少的情况下编写更多代码并不优雅 . 重点是关闭ADL .
这些好理由是什么?有时您明确要关闭ADL . 有时你想消除歧义 .
以下是可以接受的:1)函数级使用指令和函数实现中的使用声明; 2)源文件中的源文件级使用声明; 3)(有时)源文件级使用指令 .
命名空间是我们变量的附加限定符 . 假设我们在
std
中定义了'string',现在如果我们在mynamespace
中也定义'string' .现在,如果我在文件的顶部写
using namespace std;
,那么从那里开始,字符串对于编译器来说变得模糊不清 .然而,人们可以采取中间方法,严格地不在 Headers (.h)文件中使用
using namespace std;
,因为其他人可能想要使用您的类并且可能会发生冲突 . 对于实现(.cxx)文件,如果您确定不会发生任何冲突,则可以小心使用它 .