C ++:我应该使用' typedef'或者'使用命名空间'?

时间:2012-04-26 10:23:47

标签: c++ namespaces using-directives

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

using namespace project1::namespace1;
class1 obj;

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

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

我遇到过'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,会导致名称空间不明确。

4 个答案:

答案 0 :(得分:74)

您声明的两个选项不相同。这一个:

using namespace project1::namespace1;

从命名空间中提取所有内容,让您几乎无法控制并发生冲突。我只看到缺点,而且没有专业人士。

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

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

因此这两个表达式并不完全等效。

答案 1 :(得分:10)

您不应在标题文件中使用usingtypedef,只是为了让名称更容易输入

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

无论哪种方式,如果您要将符号导入全局命名空间,请使用using,而不是typedeftypedef主要用于您希望通过其他名称调用该类型时,很多时候因为它是一个模板而被使用 - 例如,my_map而不是std::map<std::string, my_type>,这仍然是明确的,但是更好的打字。

另请参阅此问题:Why is "using namespace std" considered bad practice?

答案 2 :(得分:6)

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

答案 3 :(得分:3)

使用using project1::namespace1::class1

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

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

    class1 obj;

    ...
}