【问题标题】:How can I "unuse" a namespace?如何“取消使用”命名空间?
【发布时间】:2010-09-15 03:15:04
【问题描述】:

我的开发系统(Codegear C++Builder)的变幻莫测之一是一些自动生成的标题坚持...

using namespace xyzzy

...其中的语句,在我最不希望或最不期望的时候影响我的代码。

有没有办法可以取消/覆盖之前的“使用”语句来避免这种情况。

也许……

unusing namespace xyzzy;

【问题讨论】:

  • 您可能应该使用他们的 QC 系统打开错误报告:qc.codegear.com
  • 顺便说一句,这些是哪些自动生成的标题?
  • 有一天 C++ 会有模块,将代码包含到其他代码中会有更好的封装结构。在那之前,没有一个简单的方法可以解决这个问题。考虑将您自己的代码放入命名空间并以这种方式引用它。

标签: c++ namespaces c++builder


【解决方案1】:

不。但是有一个潜在的解决方案:如果你将你的 include 指令包含在它自己的命名空间中,就像这样......

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

...然后该标头中的任何 using 指令的效果都会被中和。

这在某些情况下可能会出现问题。这就是为什么每个 C++ 风格指南都强烈建议不要将“使用命名空间”指令放在头文件中。

【讨论】:

  • 总的来说,这是一个可怕的想法。 C++ 头文件不打算包含在此处使用的备用命名空间中。
  • 在头文件中包含 using 指令也是一个糟糕的主意。这只是缓解了这个问题。
  • 将标头放在您自己的命名空间中并不是一个解决方案,因为它会改变该库中声明的含义。 (-1)
  • 这完全取决于标头中声明的内容。
  • 这正是它是未定义行为的原因。
【解决方案2】:

不,你不能不使用一个命名空间。您唯一能做的就是将using namespace-statement 放在一个块中以限制其范围。

例子:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

也许您可以更改用于自动生成标题的模板。

【讨论】:

  • 你能在这样的块中包含一个包含吗?
  • 是的,这不会与自动生成的代码一起使用。 Byt mybe他可以更改自动生成代码的模板吗?
  • 是的,这并没有真正解决他在使用名称空间的标头方面遇到的问题。
  • 不幸的是,这不是真的。试试这个:
  • 命名空间 xyzzy{ const int i{ 使用命名空间 xyzzy; } // 在这里停止使用命名空间 xyzzy
【解决方案3】:

您可能会在冲突中使用显式命名空间:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

【讨论】:

    【解决方案4】:

    供将来参考:由于 XE 版本有一个新值,您可以#define 以避免可怕的 using namespace System; int 包含:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

    【讨论】:

    • 但这似乎无法正常工作。至少在我尝试过的所有情况下(使用 BCB6)。然后,我习惯于在冲突时添加显式命名空间,甚至更糟糕的是,包含一个标题以避免类型名称冲突......
    【解决方案5】:

    如何使用 sed、perl 或其他命令行工具作为构建过程的一部分,在生成的头文件生成之后但在使用之前对其进行修改?

    【讨论】:

      【解决方案6】:

      Visual Studio 2005 的快速实验表明您可以将这些标头包含在您自己命名的命名空间中,然后将 use 包含在此命名空间中您需要的内容(但不要将 use 包含在整个命名空间中,因为它会引入命名空间你想隐藏。

      【讨论】:

      • 如果头文件是库的声明,这可能会导致名称修改问题。编译将成功,但链接器将无法找到定义,因为它们已经在不同的命名空间中编译。
      【解决方案7】:
      #include<iostream>
      #include<stdio.h>
      namespace namespace1 {
          int t = 10;
      }
      namespace namespace2 {
          int t = 20;
      }
      int main() {
      using namespace namespace1;
          printf("%d" , t);
          printf("%d" , namespace2::t);
      }
      

      【讨论】:

      • 请解释你的答案!
      • 您可以使用范围解析运算符来使用另一个命名空间变量
      • 没有解决问题
      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多