C 头文件/源文件 - enum typedef
C header file/ source file - enum typedef
如果我的头文件 (.h) 中有此声明
typedef enum {START, END, STARTEMD, COMMENTS, DIRECTIVE} BalType;
typedef struct bal * Bal;
当我进入我的 .c(源文件)时,我想创建我的结构 bal 并在其中包含一个 Baltype 属性,这样我以后就可以知道 bal 的类型。我已经这样定义了我的结构:
struct bal {
enum Baltype type;
char * name;
char * attrOne;
char * attrTwo;
};
但我收到错误:错误:字段类型不完整。我想错误出在我的 typedef 枚举上。
谢谢。
首先,typedef
创建一个 "first-class" 类型,在使用它时你不应该再说它是一个枚举。正确的方法是:
typedef enum {A, B} C;
C c; // not enum C c.
其次,考虑以下两个部分:
typedef enum {A, B} C;
enum C D;
第一个创建一个 untagged 枚举,并为其创建一个类型别名 C
。第二个创建一个单独的标记枚举(用 C
标记)并且不创建类型别名(它还声明了变量 D
但这对我们这里的考虑并不重要)。
现在您可能想知道这与您的问题有什么关系,但是如果我们采用您在创建类型时使用的名称,并在其下方放置您在 struct
中使用的名称,我会希望它会变得明显:
BalType
Baltype
^
An extra clue :-)
因此,您的问题的简化与我上面给出的 ABCD
代码非常相似:
typedef enum {START, END} BalType;
enum Baltype type;
这实际上是这两件事的 组合 让您感到悲伤。您似乎 正在创建一个完整的枚举类型,而您确实是。但是,您随后创建了一个 完全不同的 (并且不完整,因为它没有正文)枚举。由于不完整,无法按您需要的方式使用。
要解决这个问题,上面的最后一行(也是 struct
中的第一行)应该替换为:
BalType type;
如果我的头文件 (.h) 中有此声明
typedef enum {START, END, STARTEMD, COMMENTS, DIRECTIVE} BalType;
typedef struct bal * Bal;
当我进入我的 .c(源文件)时,我想创建我的结构 bal 并在其中包含一个 Baltype 属性,这样我以后就可以知道 bal 的类型。我已经这样定义了我的结构:
struct bal {
enum Baltype type;
char * name;
char * attrOne;
char * attrTwo;
};
但我收到错误:错误:字段类型不完整。我想错误出在我的 typedef 枚举上。
谢谢。
首先,typedef
创建一个 "first-class" 类型,在使用它时你不应该再说它是一个枚举。正确的方法是:
typedef enum {A, B} C;
C c; // not enum C c.
其次,考虑以下两个部分:
typedef enum {A, B} C;
enum C D;
第一个创建一个 untagged 枚举,并为其创建一个类型别名 C
。第二个创建一个单独的标记枚举(用 C
标记)并且不创建类型别名(它还声明了变量 D
但这对我们这里的考虑并不重要)。
现在您可能想知道这与您的问题有什么关系,但是如果我们采用您在创建类型时使用的名称,并在其下方放置您在 struct
中使用的名称,我会希望它会变得明显:
BalType
Baltype
^
An extra clue :-)
因此,您的问题的简化与我上面给出的 ABCD
代码非常相似:
typedef enum {START, END} BalType;
enum Baltype type;
这实际上是这两件事的 组合 让您感到悲伤。您似乎 正在创建一个完整的枚举类型,而您确实是。但是,您随后创建了一个 完全不同的 (并且不完整,因为它没有正文)枚举。由于不完整,无法按您需要的方式使用。
要解决这个问题,上面的最后一行(也是 struct
中的第一行)应该替换为:
BalType type;