C ++:我应该使用“typedef”还是“使用命名空间”?

我正在编写一个具有多个相关模块的库。 当我包含来自不同模块的文件时,是否应该使用以下命令来parsing名称空间:

using namespace project1::namespace1; class1 obj; 

要么

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

每种方法的优点/缺点是什么? 我读的地方,我们应该在.H文件中使用typedefusing .C文件,这是可取的?

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

你说的两个选项是不相同的。 这个:

 using namespace project1::namespace1; 

从名字空间拉入所有的东西 ,给你一点控制权,使冲突可能。 我只看到缺点,在这里没有优点。

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

 using project1::namespace1::class1; 

不pipe你使用这个还是使用typedef都没有太大的区别。 但请记住, typedef仅限于types和枚举,而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 

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

为了方便input名称,不要在头文件中使用usingtypedef

在源文件中,取决于您。 写出全名似乎被认为是很好的做法,因为它清楚地表明你的意思。 如果你的命名空间太长,你可以使用命名空间别名来减less混乱,但仍然保持清楚的含义: namespace ns = project1::namespace1;

无论哪种方式,如果您要将符号导入到全局名称空间中,请使用using ,而不是typedeftypedef主要用于当你想以不同的名称调用types,多次因为它是一个模板 – 例如, my_map而不是std::map<std::string, my_type> ,这仍然是清晰的,但很多更好的types。

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

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

使用using project1::namespace1::class1

或者,你可以限制你使用的namespce在本地的作用域,既方便又不污染全局的命名空间。

 void function() { using namespace project1::namespace1; class1 obj; ... }