C头文件/源文件 - 枚举typedef

时间:2015-04-01 02:34:55

标签: c enums header-files typedef

如果我在头文件(.h)中得到此声明

typedef enum {START, END, STARTEMD, COMMENTS, DIRECTIVE} BalType;
typedef struct bal * Bal;

当我进入我的.c(源文件)时,我想创建我的struct bal并在其中包含一个属性Baltype,以便稍后我可以告诉bal的类型。我已经定义了这样的结构:

struct bal {
    enum Baltype type;
    char * name;
    char * attrOne;
    char * attrTwo;
};

但我得到错误:错误:字段类型具有不完整的类型。我猜错误出现在我的typedef枚举上。

谢谢你。

1 个答案:

答案 0 :(得分:4)

首先,typedef创建一个“一流”类型,在使用它时不应该说它是一个枚举。正确的方法是:

typedef enum {A, B} C;
C c;                    // not enum C c.

其次,请考虑以下两个部分:

typedef enum {A, B} C;
enum C D;

第一个创建未标记的枚举,并为其创建类型别名C。第二个创建一个单独的标记枚举(用C标记)并且不创建类型别名(它也声明变量D但这对我们的考虑并不重要。)

现在您可能想知道这与您的问题有什么关系,但如果我们采用您在创建类型时使用的名称,并在其下方放置您在struct中使用的名称,我希望它会变得很明显:

BalType
Baltype
   ^
   An extra clue :-)

因此,问题的简化与我上面给出的ABCD代码非常相似:

typedef enum {START, END} BalType;
enum Baltype type;

实际上,这两件事的组合让你感到悲伤。你似乎要创建一个完整的枚举类型,你就是。但是,然后您创建一个完全不同的(并且不完整,因为它没有正文)枚举。如果不完整,则不能以您需要的方式使用。

要解决此问题,上面的最后一行(以及struct中的第一行)应替换为:

BalType type;