【问题标题】:Is it wrong to use C++ 'using' keyword in a header file?在头文件中使用 C++ 'using' 关键字是错误的吗?
【发布时间】:2010-02-09 21:03:42
【问题描述】:

有人告诉我,在头文件中包含“使用命名空间 ns123”很糟糕,但我不记得给出的原因是什么。这实际上是一件坏事吗?为什么?

【问题讨论】:

  • 您没有说明,但我相信您的意思是(并且所有当前的答案都假设)您正在谈论在标头中使用全局范围内的指令。在非全局范围内(例如,在您完全控制的命名空间或函数内部),您会得到不同的答案。
  • 这个问题如果能解决 Roger Pate 提出的问题会更好。

标签: c++ namespaces


【解决方案1】:

一般来说,这是一种不好的做法,因为它违背了命名空间的目的。通过在标头中定义,您不会对 using 声明的范围进行严格控制,这意味着您可能会在意想不到的地方遇到名称冲突。

【讨论】:

  • 你说的是指令还是声明?还是两者兼而有之?
【解决方案2】:

如果您将using 声明放在头文件中,则任何#includes 头文件的名称也会导入命名空间,无论他们是否愿意。这违反了最小意外原则,并且通过允许更改 #include 语句很容易导致命名冲突,从而破坏了命名空间的目的。如果您想在自己的 .cpp 文件中导入命名空间以节省少量输入并生成更具可读性的代码,那很好。只是不要强迫你的模块的用户做同样的事情。

【讨论】:

  • using namespace N; 是 using 指令,而不是 using 声明。 using 声明可能是合适的,因为它只影响指定的名称而不是 N 中的任何内容,如果这是所需的话。 (using N::name; 是一个使用声明的例子。)
【解决方案3】:

将所有类和函数从它们的命名空间中拉出通常是一个坏主意,实际上与拥有命名空间的概念相反……通常在特定类或函数上使用“使用”会更好。

【讨论】:

  • 不过,在 .cpp 文件中并没有那么糟糕,因为您忽略了本地区域中的命名空间。在 .h 文件中,您忽略了一个大且定义不明确的区域中的命名空间。
【解决方案4】:

它经常会给您带来奇怪而神秘的编译错误,一方面,您可以花费数小时试图找出问题的根源。

【讨论】:

    【解决方案5】:

    普通 C++ 编程

    是的,通常在某些地方这是有意义的,并且您可以控制在何处以及如何使用 using 雄蕊。如果这是一个范围有限的程序,则无需担心将 usings 置于全局范围内。

    对于单体应用程序,我强烈建议不要将 usings 放置在非常繁忙的命名空间中——因为一旦你提交了冲突,你就会发疯。例如:

    1. ::
    2. ::公司名称
    3. ::公司名::组件
    4. ::公司名称::组件::子组件。

    我会说,使用 3 级或 4 级的语句开始放置是完全可以接受的——那是发生冲突的机会开始变得非常低的地方。

    通用/TMP 编程

    在通用编程和 TMP 中,使用通常用于为特定域配置库,这通常通过 using 语句来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多