gpt4 book ai didi

c++ - 是否所有 using 指令都被视为与 using namespace std 相同的方式?

转载 作者:行者123 更新时间:2023-11-28 03:32:01 27 4
gpt4 key购买 nike

我很容易养成使用 std:: 作为标准标识符前缀的习惯,而不是坚持使用 using namespace std;。但是,我已经开始接触 C# 并且我注意到添加任何必要的 using 指令是很正常的,即,您会看到:

using System;
Console.Write("foo");

代替:

System.Console.Write("foo");

显然,正如我从关于该主题的 C# 问题中发现的那样,这种用法来自于 C# 中的各个系统命名空间比 C++ 中的 std 小得多,因此消除了与名称冲突相关的问题,因为可能性要小得多(如果库更新时出现名称冲突,您可以用完全限定的名称查找替换它),并消除与出现的大量 Intellisense 选项相关的问题,因为命名空间足够小,可以处理。

那么问题是,如果这些是在 C# 中使用 using 指令的长期理由,那么对于 C++ 也是如此吗?将其应用于较小的第三方命名空间以及您自己的较小命名空间通常是否可以接受?

现在我意识到这可能会引起一些争议,我想借此机会请求它不要变成争论。一个好的答案应该包括一个基础,即优势或劣势,以及使用一种方式相对于另一种方式如何真正产生有值(value)的差异。

我问这个的原因是为了解决这个问题,并可能消除在 C++ 中使用指令一定是坏事的观念。当然,如果需要,可以使用命名空间别名来缩短较长的命名空间名称,如果需要,仍然可以使用完全限定的名称,但有时 using 指令会大大简化访问某些成员的过程,例如用户定义的文字运算符,据我所知,没有任何形式的 ADL,这意味着您要么必须使用 using 指令,要么通过函数语法调用运算符方法,这首先违背了使用运算符的全部目的。

例如,我有一个命名空间(包括一个表示键盘键的结构,以及一个作为可读替代访问方式的文字后缀:

"caps lock"_key.disable();

这里的问题是,除非您之前插入了 using namespace Whatever;using Whatever::operator""_key;,否则代码将无法编译,这对用户来说是个坏消息。

当涉及 std 时,使用指令有明显的问题,或者当它们在 header 中以这种方式使用时会为该 header 的用户带来不需要的额外内容,但是将它们用于其他是否合理 namespace 包含在比包含 header 的范围更小的范围内时?由于不必每次都键入每个限定符而节省的击键次数确实加起来了,而且借助当今的 Intellisense 功能,找出非限定标识符属于哪个命名空间就像将鼠标悬停在它上面一样简单。

最佳答案

我认为在 C++ 中使用声明的规则相当简单:

  1. 永远不要写“using namespace anything”;在 header 的全局范围内,尤其是可能被其他程序重用的 header (例如,在编写库时)。它使用此命名空间的符号污染了所有后续 header 的全局范围,这违背了命名空间的全部目的,并且可能在以后造成无法预料的名称冲突。
  2. 在 .cpp 文件和 header 的内部范围(例如,内联函数范围)中,您可以“使用”您想要的任何命名空间,因为它不会影响任何其他文件。只做对您来说更方便的事情,并尝试在项目中保持合理的一致性。

编辑:对于 _key 问题,只需在其自己的命名空间中定义此运算符并告诉用户导入它。这样他们就不需要输入运算符声明。

namespace something {
class key { ... };
}
namespace key_suffix {
something::key operator"" _key() { ... }
}

// user code
void some_function() {
using namespace key_suffix;
"caps lock"_key.doSomething();
}

关于c++ - 是否所有 using 指令都被视为与 using namespace std 相同的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12256587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com