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

Tha*_*ipo 1 c enums typedef header-files

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

typedef enum {START, END, STARTEMD, COMMENTS, DIRECTIVE} BalType;
typedef struct bal * Bal;
Run Code Online (Sandbox Code Playgroud)

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

struct bal {
    enum Baltype type;
    char * name;
    char * attrOne;
    char * attrTwo;
};
Run Code Online (Sandbox Code Playgroud)

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

感谢您。

pax*_*blo 5

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

typedef enum {A, B} C;
C c;                    // not enum C c.
Run Code Online (Sandbox Code Playgroud)

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

typedef enum {A, B} C;
enum C D;
Run Code Online (Sandbox Code Playgroud)

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

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

BalType
Baltype
   ^
   An extra clue :-)
Run Code Online (Sandbox Code Playgroud)

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

typedef enum {START, END} BalType;
enum Baltype type;
Run Code Online (Sandbox Code Playgroud)

实际上,正是这两件事的结合给你带来了悲伤。似乎正在创建一个完整的枚举类型,确实如此。但是,您随后创建了一个完全不同的(并且不完整的,因为它没有主体)枚举。由于不完整,它无法按照您需要的方式使用。

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

BalType type;
Run Code Online (Sandbox Code Playgroud)