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

C++: Should I use 'typedef' or 'using namespace'?

本文关键字:命名空间 typedef C++ 我应该 还是      更新时间:2023-10-16

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

using namespace project1::namespace1;
class1 obj;

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

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

我在使用"typedef"

时遇到的一个问题是,如果我在第三个模块中同时包含原始类和带有"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

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

切勿仅仅为了使名称更易于键入而在头文件中使用 usingtypedef

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

无论哪种方式,如果要将符号导入全局命名空间,请使用 using ,而不是 typedeftypedef主要用于您想用不同的名称调用类型,很多时候因为它是一个模板 - 例如,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;
    ...
}