C ++:我应该使用“typedef”还是“使用命名空间”?
我正在编写一个具有多个相关模块的库。 当我包含来自不同模块的文件时,是否应该使用以下命令来parsing名称空间:
using namespace project1::namespace1; class1 obj;
要么
typedef project1::namespace1::class1 class1; class1 obj;
每种方法的优点/缺点是什么? 我读的地方,我们应该在.H文件中使用typedef
和using
.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名称,不要在头文件中使用using
或typedef
。
在源文件中,取决于您。 写出全名似乎被认为是很好的做法,因为它清楚地表明你的意思。 如果你的命名空间太长,你可以使用命名空间别名来减less混乱,但仍然保持清楚的含义: namespace ns = project1::namespace1;
无论哪种方式,如果您要将符号导入到全局名称空间中,请使用using
,而不是typedef
。 typedef
主要用于当你想以不同的名称调用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; ... }