命名空间与头文件

时间:2010-04-20 06:34:46

标签: c++ namespaces typedef

我在询问C ++项目中广泛使用的最佳实践。我需要在项目中拥有自己的类型。它是几个typedef的集合。

包含头文件包含C ++中的类型良好实践,还是使用命名空间更好。如果是这样,为什么?这两种方式的优点和缺点是什么?

现在它看起来像这样:

types.h中:

#ifndef TYPES_H
#define TYPES_H

#include <list>

// forward declaration
class Class;

typedef int TInt;
// ...
typedef std::list<Class> class_list;

#endif

class.h:

#ifndef CLASS_H
#define CLASS_H

#include "types.h"

class Class
{
    public:
        // ...

        TInt getMethod();
    private:
        // ...
};

命名空间的外观如何?

3 个答案:

答案 0 :(得分:10)

这两个概念是正交的;比较它们你提出的方式毫无意义。

除非您只在单个文件中使用这些类型,否则必须将它们放在标题中,以便在需要时轻松引入它们的定义。然后,在该标题中,您可以包含命名空间:

#ifndef TYPES_H
#define TYPES_H

#include <list>

namespace MyNamespace {
  // forward declaration
  class Class;

  typedef int TInt;
  // ...
  typedef std::list<Class> class_list;
}

#endif

之后你可以在MyNamespace::TInt

之后做int而不是#include "Types.h"

答案 1 :(得分:4)

从依赖关系的角度来看,在单个标头中命名所有类型可能是维护的噩梦。这对于typedef是可以理解的,因为您需要一个唯一的定义,但没有理由在这里转发声明class

// types.h

namespace myproject
{
  typedef int TInt;
} // namespace myproject

向前声明Class符号没有意义:您污染了自己的命名空间。让每个文件独立决定是否需要符号,然后自行声明它。

宣称ClassList也不是很好:它应该仅对需要它的人可用。您可以为Class相关内容的前向声明创建特定标题:

// class_fwd.h

namespace myproject
{
  class Class;
  typedef std::list<Class> ClassList;
} // namespace myproject


// class.h

#include "myproject/class_fwd.h"

namespace myproject
{
  class Class {};
} // namespace myproject

答案 2 :(得分:1)

嗯......我认为包含头文件很好。我不确定命名空间是如何攻击同一个问题的......

这样的任何“最佳实践”的主要内容是BE CONSISTENT。