C++:我应该使用'typedef'还是'using namespace'?

vid*_*vid 39 c++ namespaces using-directives

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

using namespace project1::namespace1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)

要么

typedef project1::namespace1::class1 class1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)

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

我遇到的'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,则会导致名称空间不明确.

jua*_*nza 74

您声明的两个选项不相同.这个:

using namespace project1::namespace1;
Run Code Online (Sandbox Code Playgroud)

从命名空间中提取所有内容,让您几乎无法控制并且可能发生冲突.我只看到缺点,没有专业人士.

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

using project1::namespace1::class1;
Run Code Online (Sandbox Code Playgroud)

无论你使用这个还是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
Run Code Online (Sandbox Code Playgroud)

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

  • 真的,很好的答案. (5认同)

小智 10

你不应该使用usingtypedef头文件只是为了使名称更容易输入的缘故.

在源文件中,由您决定.写出全名似乎被认为是一种好习惯,因为它非常清楚你的意思.如果您的命名空间太长,您可以使用命名空间别名来减少混乱,但仍然保持清晰的含义:namespace ns = project1::namespace1;

无论哪种方式,如果您要将符号导入全局命名空间,请使用using,而不是typedef.typedef主要用于当你想用不同的名称调用类型时,很多次因为它是一个模板 - 例如,my_map而不是std::map<std::string, my_type>,它仍然是清晰的,但键入更好.

另外,请看这个问题:为什么"使用命名空间std"被认为是不好的做法?

  • 从不在标题中使用`typedef`?真的吗?-1.标准做法是在应用程序的其余部分中键入要定义的几种类型,并将它们全部放在一个标题中.示例包括libsdl中的Uint8和Qt 4中的quint16. (3认同)
  • @DavidSchmitt:你提到的两种"使用模式"都是相同的并且表示相同的东西 - 你制作中央标题并使用在该标题中声明的类型.无论是"进口"/"出口"都无关紧要.parkovski的建议听起来不合理,因为*.h中有很多地方可以放置typedef - 你可以把它放在类,命名空间等中,这是安全的.此外,typedef不会造成混乱.因此无论你如何看待它,"*.h中没有typedef"听起来像是对编码风格的无意义的人为限制 - 没有任何好处,所以不应该使用这个规则. (3认同)
  • @SigTerm:parkovski对标题中的本地使用的缩写传入类型皱眉.使用typedef定义暴露的API是完全不同的,没问题. (2认同)

IPr*_*ory 6

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