C++:我应该使用'typedef'还是"使用命名空间"?
C++: Should I use 'typedef' or 'using namespace'?
我正在编写一个包含多个依赖模块的库。当我包含来自不同模块的文件时,我是否应该使用以下方式解析命名空间:
using namespace project1::namespace1;
class1 obj;
或
typedef project1::namespace1::class1 class1;
class1 obj;
每种方法的优缺点是什么?我在某处读到我们应该typedef
在.H 文件和 using
中的 。C文件,这是可取的吗?
时遇到的一个问题是,如果我在第三个模块中同时包含原始类和带有"typedef"的类,则会导致命名空间歧义。
您声明的两个选项并不等效。这个:
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
所以这两个表达式并不完全等价。
切勿仅仅为了使名称更易于键入而在头文件中使用 using
或 typedef
。
在源文件中,由您决定。写出整个名字似乎被认为是很好的做法,因为它非常清楚地表明你的意思。如果命名空间太长,可以使用命名空间别名来减少混乱,但仍保持含义清晰:namespace ns = project1::namespace1;
无论哪种方式,如果要将符号导入全局命名空间,请使用 using
,而不是 typedef
。 typedef
主要用于您想用不同的名称调用类型,很多时候因为它是一个模板 - 例如,my_map
而不是std::map<std::string, my_type>
,这仍然很清楚,但键入起来要好得多。
另请参阅此问题:为什么"使用命名空间 std"被认为是不良做法?
最明确的方法是不使用任何这些方法 - 只需编写new project1::namespace1::class1()
.
使用using project1::namespace1::class1
或者,您可以限制在本地范围内使用 namepce,这既是为了您的方便,也是为了不破坏全局命名空间。
void function()
{
using namespace project1::namespace1;
class1 obj;
...
}
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- Typedef 不是命名空间的成员
- 在 typedef 中使用相同的名称,并从命名空间使用
- C++:我应该使用'typedef'还是"使用命名空间"?
- 解析typedef和命名空间VS2010
- 是否可以转发声明命名空间内的 typedef
- typedef 或在我的命名空间中公开外部库类时使用的 using 关键字