在哪里保存typedef,我应该重复typedef

时间:2011-07-13 06:49:41

标签: c++ typedef

说我有三个文件

//first.h
typedef typename std::map<Vertex_t*,Vd_t> MapVertexVd_t;
//the graph class and ...
//other useful things related to a graph class

//second.h
#include "first.h"
class analyzeGraph {
MapVertexVd_t mapVertexVd;

public:
void fillMap();
};

//second.cpp
#include "second.h"
void analyzeGraph::fillMap()
{
//
}

现在问题是我应该放置:

typedef typename std::map<Vertex_t*,Vd_t> MapVertexVd_t;
为了清楚起见,在文件second.h和second.cpp中

。我觉得我会感到困惑 经过一段时间,因为我的代码中有太多的typedef和typename。

5 个答案:

答案 0 :(得分:5)

我发现根据具体情况,这些方法很有效:

  • 对于在很多文件中使用的typedef,将它们放在共享头文件中(可能带有前向声明等)。
  • 对于仅由少数函数或方法使用的typedef(在声明中),请将它们放在第一个相关声明之前,并确保函数一起声明。
  • 对于用于类或函数中数据的typedef,将它们放在相关范围的开头,以便读取代码的人首先看到它们。 (对于类,使typedef的可见性尽可能低 - 私有typedef应保持私有。)

答案 1 :(得分:3)

不,请确保声明不重复。

你现在的方式实际上非常好 - 你有一个单独的H文件与typedef,它包含在使用类型的任何地方。这就是应该如何。

重复的问题是某些编译器可能不喜欢它,即使它们是相同的。如果在某些时候你必须改变typedef - 那么你就是一团糟。这就是为什么你应该避免重复。

答案 2 :(得分:3)

在C89或C99(或预标准C)中,在同一范围内重复typedef是编译错误,虽然它是令人讨厌的。但是,C ++更加文明,允许“良性重新定义”(参见§7.1.3,¶2,根据Charles Bailey)。尽管有这个许可证,其中一个敏捷(或实用)编程的格言是“干:不要重复自己”,在这种情况下,你不应该在多个标题中写typedef。您可以考虑创建每个其他标头(zeroth.hfirst.h)所包含的标头second.h;它应该定义或转发声明类型Vertex_t;它必须定义或包含Vd_t的声明(以及指定类型MapVertexVd_t)。它还应该包含相关的标准标题(<map>),以便zeroth.h标题是自包含的,并且可以在没有任何需要它的代码的情况下使用它。


请注意,C11还允许对类型进行良性重新定义:

ISO / IEC 9899:2011§6.7声明

  

¶3如果标识符没有链接,则标识符的声明不得超过一个   (在声明符或类型说明符中)具有相同的作用域和相同的名称空间,除外   那个:

     
      
  • 可以重新定义typedef名称以表示与当前相同的类型,   只要该类型不是可变修改类型;

  •   
  • 标签可以按照6.7.2.3中的规定重新申报。

  •   

相比之下,C99的相应部分说:

ISO / IEC 9899:1999§6.7声明

  

§3如果标识符没有链接,则标识符的声明不得超过一个   (在声明符或类型说明符中)具有相同的作用域和相同的名称空间,除外   对于6.7.2.3中指定的标签。

答案 3 :(得分:3)

如果仅在 analyzeGraph 中使用 MapVertexVd_t ,最好将typedef放在 analyzeGraph 类中。

答案 4 :(得分:2)

避免在不同的翻译单元中重复typedef,如果您稍后更改其中一个翻译单元,则最终会导致维护噩梦不得不追逐您定义相同typedef的所有位置。

我的简单规则是将其定义为有意义的。在许多情况下,它将与一些相关类型(可能具有Vertex_t的定义)一起使用,并为typedef使用合理的名称来指示它是什么。只有当您不知道Vertex_tVd_t是什么时,您才需要返回并查看MapVertexVd_t是什么,然后拥有本地typedef也无济于事(我不知道)知道Vertex_tVd_t代表什么,但选择合理的名称,敲响钟形,知道类型是什么以及你可以对它执行什么操作。)