我正在编写一个包含多个依赖模块的库。当我包含来自不同模块的文件时,我应该使用以下命令解析命名空间:
using namespace project1::namespace1;
class1 obj;
或
typedef project1::namespace1::class1 class1;
class1 obj;
每种方法的优点/缺点是什么?我在某处读到我们应该在.H文件中使用typedef
和在.C文件中使用using
,这是否可取?
我遇到过'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,会导致名称空间不明确。
答案 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)
您不应在标题文件中使用using
或typedef
,只是为了让名称更容易输入。
在源文件中,由您决定。写出全名似乎被认为是一种好习惯,因为它非常清楚你的意思。如果您的命名空间太长,您可以使用命名空间别名来减少混乱,但仍然保持清晰的含义:namespace ns = project1::namespace1;
无论哪种方式,如果您要将符号导入全局命名空间,请使用using
,而不是typedef
。 typedef
主要用于您希望通过其他名称调用该类型时,很多时候因为它是一个模板而被使用 - 例如,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;
...
}