重新定义typedef枚举

时间:2013-11-17 09:08:41

标签: c++ types enums typedef

例如,我们有以下源文件:

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中还是有另一种(对吧?)方式?谢谢。

2 个答案:

答案 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
}

但不建议这样做,因为现在编译取决于包含标题的顺序。