C++ C++;:我应该使用';typedef';或';使用名称空间';?

C++ C++;:我应该使用';typedef';或';使用名称空间';?,c++,namespaces,using-directives,C++,Namespaces,Using Directives,我正在编写一个包含多个依赖模块的库。当我包含来自不同模块的文件时,是否应使用以下方法解析命名空间: using namespace project1::namespace1; class1 obj; 或 每种方法的优点/缺点是什么?我在某个地方读到,我们应该在.H文件中使用typedef,在.C文件中使用,这是否可取 “typedef”遇到的一个问题是,如果在第三个模块中同时包含原始类和带有“typedef”的类,则会导致名称空间不明确。最清楚的方法是不要使用这些方法中的任何一种-只需编写ne

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

using namespace project1::namespace1;
class1 obj;

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


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

最清楚的方法是不要使用这些方法中的任何一种-只需编写
newproject1::namespace1::class1()。这个:

using namespace project1::namespace1;
从名称空间中提取所有内容,使您几乎无法控制并可能发生冲突。我在这里只看到缺点,没有优点

但是您不需要使用
typedef
来引入单个符号,您可以使用

using project1::namespace1::class1;
无论您使用此选项还是
typedef
,都没有太大区别。但请记住,
typedef
仅限于类型和枚举,而
使用
可以引用值、函数等:

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

因此这两个表达式并不完全相同。

使用
使用project1::namespace1::class1

或者,您可以限制在本地范围内使用namespce,这既方便您的使用,又不影响全局名称空间

void function()
{
    using namespace project1::namespace1;

    class1 obj;

    ...
}

绝不能仅仅为了使名称更易于键入而在头文件中使用
typedef

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

无论哪种方式,如果要将符号导入全局名称空间,请使用
using
,而不是
typedef
typedef
主要在您想用不同的名称调用类型时使用,很多时候是因为它是一个模板-例如,
my_map
而不是
std::map
,后者仍然清晰,但键入起来更好


另外,请参见此问题:

另一种选择是使用project1::namespace1::class1“视情况而定”。这里没有一个正确的答案。@B谢谢。你能详细说明吗?C++没有一个连贯的设计结构,因为它在时间上加上了它自己的特性,在C的顶部,所以它既有“使用”又有“TyPulf”,对于一个项目来说,在实用程序中很难区分。“我们应该在.h文件中使用‘TyPuff’和‘使用’in .c文件”-我不同意在.h文件中使用整个名称空间,因为这意味着您正在用.c文件可能不期望的东西污染全局名称空间。c文件是它自己的编译单元,可以做任何它想做的事情。然而,我认为hmjd的解决方案比typedef好。听起来不错。这也将避免问题中提到的模糊性问题。是否永远不要在标题中使用
typedef
?真的吗-1.这是一个标准的做法,在应用程序的其余部分键入要使用的几种类型,并将它们全部放在一个标题中。示例包括libsdl中的Uint8和qt4中的quint16。@SigTerm:parkovski不赞成缩写传入类型以供标头中的本地使用。使用typedefs定义公开的API是完全不同的,可以。@DavidSchmitt:您提到的两个“使用模式”都是相同的,并且表示相同的内容-您创建中心标题并使用该标题中声明的类型。是否用于“导入”/“导出”无关紧要。parkovski的建议听起来不合理,因为在*.h中有许多地方可以放置typedef,您可以将其封装在类、命名空间等中,这是安全的。此外,typedef不会造成混乱。所以不管你怎么看,“no typedef in*.h”听起来像是对编码风格的一种毫无意义的人为限制——没有任何好处,所以不应该使用这个规则。@SigTerm我想你没有读过这句话的其余部分。标准C在标题中有大量非常有用的typedef(
size\u t
ptrdiff\u t
)。不同的是,它们是API的一部分,有特定的用途,而不仅仅是“因为我不喜欢2型”的快捷方式。这可能是,但有时会有点冗长,不是吗?
void function()
{
    using namespace project1::namespace1;

    class1 obj;

    ...
}