说我有三个文件
//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。
答案 0 :(得分:5)
我发现根据具体情况,这些方法很有效:
答案 1 :(得分:3)
不,请确保声明不重复。
你现在的方式实际上非常好 - 你有一个单独的H文件与typedef
,它包含在使用类型的任何地方。这就是应该如何。
重复的问题是某些编译器可能不喜欢它,即使它们是相同的。如果在某些时候你必须改变typedef
- 那么你就是一团糟。这就是为什么你应该避免重复。
答案 2 :(得分:3)
在C89或C99(或预标准C)中,在同一范围内重复typedef是编译错误,虽然它是令人讨厌的。但是,C ++更加文明,允许“良性重新定义”(参见§7.1.3,¶2,根据Charles Bailey)。尽管有这个许可证,其中一个敏捷(或实用)编程的格言是“干:不要重复自己”,在这种情况下,你不应该在多个标题中写typedef
。您可以考虑创建每个其他标头(zeroth.h
,first.h
)所包含的标头second.h
;它应该定义或转发声明类型Vertex_t
;它必须定义或包含Vd_t
的声明(以及指定类型MapVertexVd_t
)。它还应该包含相关的标准标题(<map>
),以便zeroth.h
标题是自包含的,并且可以在没有任何需要它的代码的情况下使用它。
请注意,C11还允许对类型进行良性重新定义:
¶3如果标识符没有链接,则标识符的声明不得超过一个 (在声明符或类型说明符中)具有相同的作用域和相同的名称空间,除外 那个:
可以重新定义typedef名称以表示与当前相同的类型, 只要该类型不是可变修改类型;
标签可以按照6.7.2.3中的规定重新申报。
相比之下,C99的相应部分说:
§3如果标识符没有链接,则标识符的声明不得超过一个 (在声明符或类型说明符中)具有相同的作用域和相同的名称空间,除外 对于6.7.2.3中指定的标签。
答案 3 :(得分:3)
如果仅在 analyzeGraph 中使用 MapVertexVd_t ,最好将typedef放在 analyzeGraph 类中。
答案 4 :(得分:2)
避免在不同的翻译单元中重复typedef
,如果您稍后更改其中一个翻译单元,则最终会导致维护噩梦不得不追逐您定义相同typedef的所有位置。
我的简单规则是将其定义为有意义的。在许多情况下,它将与一些相关类型(可能具有Vertex_t
的定义)一起使用,并为typedef使用合理的名称来指示它是什么。只有当您不知道Vertex_t
或Vd_t
是什么时,您才需要返回并查看MapVertexVd_t
是什么,然后拥有本地typedef也无济于事(我不知道)知道Vertex_t
或Vd_t
代表什么,但选择合理的名称,敲响钟形,知道类型是什么以及你可以对它执行什么操作。)