例如,我们有以下源文件:
types.h中:
#pragma once
typedef enum { RED, GREEN, BLUE } myColorSet;
whatever.h:
#pragma once
myColorSet getColor( int args[] );
whatever.cpp
#include "whatever.h"
#include "types.h"
myColorSet getColor( int args[] ) {
//returning the color according to args
}
编译此抛出:
'myColorset':重新定义;符号不能用typedef重载。 请参阅'myColorset'的声明。
这对我来说有点混乱,但似乎编译器认为
myColorSet getColor( ... );
来自whatever.h的是myColorSet
的声明。我想在myColorSet
函数中使用getColor
作为返回类型。我错过了什么吗?
此外,当我在whatever.h(而不是whatever.cpp)中包含“types.h”时,它可以正常工作。但据我所知,最好避免包括.h文件。
我应该把include放在whatever.h中还是有另一种(对吧?)方式?谢谢。
答案 0 :(得分:2)
在any.h中,你需要把
#include "types.h"
或者没有,编译器将无法识别该类型,即使它已在whatever.cpp中使用whatever.h进行声明;错误发生在whatever.h
中另一个解决方案是摆脱types.h,并将typedef
放在whatever.h中,并从whatever.cpp中删除#include "types.h"
,这意味着你必须做{ {1}}无论如何,并且意味着您将包含更少的文件[更容易记住]
答案 1 :(得分:0)
当您声明myColorSet getColor( int args[] )
时,编译器还不知道myColorSet
;但它需要,因为myColorSet
是该函数的返回类型。
你是对的,最好避免包含在.h文件中。但这仅适用于您必须在#include
和前向声明之间进行选择的情况。在这种情况下,首选前瞻性声明。有些情况下,前向声明是不够的。在这些情况下,您 使用#include
。
您可以通过whatever.cpp
之类的
#include "types.h"
// myColorSet is now known, so we can declare getColor(int args[]) now:
#include "whatever.h"
myColorSet getColor( int args[] ) {
//returning the color according to args
}
但不建议这样做,因为现在编译取决于包含标题的顺序。