【问题标题】:How to limit the scope of a "using namespace ..."? c++如何限制“使用命名空间...”的范围? C++
【发布时间】:2021-08-13 12:39:10
【问题描述】:

我有“我的命名空间”(myns::) 方法实现的文件,在函数之前有很多“myns::”。我想使用命名空间编写,但它会在其他文件中可见。我不能在“使用命名空间 mysp;”之前写“静态”。

my_namespace_file.h:

namespace myns {
  void F1();
  void F2();
}

my_imp_file.h:

#include "my_namespace_file.h"

// problem is here
using namespace myns;

void F1() {}
void F2() {}

如果我在这里使用“使用命名空间 myns;”并将 my_imp_file.h 包含在我不会在此文件“myns::”中使用的其他文件中

【问题讨论】:

  • 你也可以将实现包装在命名空间块中,这样你就不需要重复命名空间名称了吗?如果这不是您想要的,请显示一些代码来说明问题。
  • 如果它是一个实现文件,你不应该在任何地方包含它
  • @THND 不要在头文件中使用using namespace 语句,至少在全局级别,这正是您发现的原因。仅在实现文件中或在特定范围内使用此类语句,但肯定不在全局级别。

标签: c++ namespaces


【解决方案1】:

就这么简单:

#include "my_namespace_file.h"

namespace myns {

void A::F1() {} // class name must be repeated, because you cannot open namespace of the class
void A::F2() {}

}

由于您永远不应该在#include 文件中包含实现,因此您也可以使用using namespace myns;,但是如果您在不同的命名空间中创建另一个类A,这可能会适得其反。最好只正确使用命名空间。

【讨论】:

  • 再写“命名空间...{}”?好的,我试试看
  • @THND 是的。命名空间可以根据需要多次打开。没有限制,你只做一次或类似的事情。
  • 这样用可以吗?或者最好到处写“myns::”
  • 优点/缺点:为命名空间创建一个范围,而不是围绕实现明确限定它,这样噪音更小,更容易使用。但是,如果它是一个很大的命名空间,则不太清楚您正在使用什么,或者名称来自哪里。意外地将新名称添加到您不想要的名称空间也更容易。如果代码使用了许多命名空间,那么缺乏资格可能很难跟踪,但如果所有代码主要使用来自其自己(单个)命名空间的代码,那么开放命名空间范围通常是减少噪音的更好选择。
【解决方案2】:

niceheadername.h:

namespace myns{
  extern void coolFunctionName(); // I exist!
}

nicecppfilename.cpp:

#include "niceheadername.h" // I exist in "niceheadername.h"
void myns::coolFunctionName(){ // this is what I contain!
  //put content here
}

然后,在您编写的所有其他文件中 #include "niceheadername.h" 告诉编译器在哪里可以找到这些函数。

【讨论】:

  • 哦顺便说一句,如果你想在其他文件中使用该函数,你需要说myns::coolFunctionName();,或者using myns;,因为它在一个命名空间中
  • 我知道,但是我想在文件“nicecppfilename.cpp”中写一些东西,以免到处写“myns::”(在这个文件中),但是如果我在其他文件中使用它我必须写“myns::”
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多