40

我正在编写一个包含多个依赖模块的库。当我包含来自不同模块的文件时,我应该使用以下方式解析名称空间:

using namespace project1::namespace1;
class1 obj;

或者

typedef project1::namespace1::class1 class1;
class1 obj;

每种方法的优缺点是什么?我在某个地方读到了我们应该typedef在 .H 文件和using.C 文件中使用的地方,这是可取的吗?

我在使用“typedef”时遇到的一个问题是,如果我在第三个模块中同时包含原始类和带有“typedef”的类,则会导致命名空间模糊。

4

4 回答 4

76

您说的两个选项不等效。这个:

using namespace project1::namespace1;

从名称空间中提取所有内容,使您几乎无法控制并可能发生冲突。我在这里只看到缺点,没有优点。

但是您不需要使用 atypedef来引入单个符号,您可以使用

using project1::namespace1::class1;

无论您使用它还是使用它typedef都没有太大的区别。但请记住,这typedef仅限于类型和枚举,而using可以引用值、函数等:

namespace X {
  const int x{42};
  enum Fruit{Apple, Pear};
}

using X::x; // OK
typedef X::x xx; // Error! 'x' in namespace 'X' does not name a type

所以这两个表达式并不完全等价。

于 2012-04-26T10:29:48.897 回答
8

永远不要为了使名称更易于键入而在头文件中使用usingor 。typedef

在源文件中,由您决定。写出整个名称似乎被认为是一种很好的做法,因为它可以非常清楚地说明您的意思。如果你的命名空间太长,你可以使用命名空间别名来减少混乱,但仍然保持含义清晰:namespace ns = project1::namespace1;

无论哪种方式,如果您要将符号导入全局命名空间,请使用using,而不是typedef. typedef主要用于当您想用不同的名称调用类型时,很多时候因为它是一个模板 - 例如,my_map而不是std::map<std::string, my_type>,它仍然很清楚,但打字更好。

另外,请参阅这个问题:为什么“使用命名空间标准”被认为是不好的做法?

于 2012-04-26T10:40:01.800 回答
6

最明确的方法是不使用任何这些方法 - 只需编写new project1::namespace1::class1().

于 2012-04-26T10:28:31.840 回答
3

采用 using project1::namespace1::class1

或者,您可以将使用名称空间限制在本地范围内,既方便又不污染全局名称空间。

void function()
{
    using namespace project1::namespace1;

    class1 obj;

    ...
}
于 2012-04-26T10:37:13.303 回答