我不太明白为什么这种结构是这样定义的。
这是有问题的代码块......
typedef struct Except_Frame Except_Frame;
struct Except_Frame {
Except_Frame *prev;
jmp_buf env;
const char *file;
int line;
const T *exception;
};
为什么这个结构以这种方式定义,而不仅仅是......
typedef struct {
Except_Frame *prev;
jmp_buf env;
const char *file;
int line;
const T *exception;
} Except_Frame;
有什么好处?
答案 0 :(得分:4)
如果您不使用:
typedef struct Except_Frame Except_Frame;
然后,需要使用以下内容定义struct
:
struct Except_Frame {
// The keyword struct is necessary without the typedef
struct Except_Frame *prev;
jmp_buf env;
const char *file;
int line;
const T *exception;
};
如果要在一个语句中定义struct
和typedef
,它将是:
typedef struct Except_Frame {
// The keyword struct is necessary without the typedef
// being defined ahead of the definition of the struct.
struct Except_Frame *prev;
jmp_buf env;
const char *file;
int line;
const T *exception;
} Except_Frame;
答案 1 :(得分:1)
使用
typedef struct Except_Frame Except_Frame;
您正在将结构“struct Except_Frame”重命名为“Except_Frame”。
首先,键入Except_Frame而不是结构Except_Frame更方便。 其次,在这种情况下,结构的字段“Except_Frame * prev”将在编译时失败,因为编译器不熟悉名为“Except_Frame”的结构(它熟悉一个名为struct Except_Frame的结构)
干杯, Ñ
答案 2 :(得分:0)
如果您需要typedef名称,那么您可以使用的两种流行的样式变体实际上如下所示
typedef struct Except_Frame Except_Frame;
struct Except_Frame {
Except_Frame *prev;
...
};
或
typedef struct Except_Frame {
struct Except_Frame *prev;
...
} Except_Frame;
请注意与第二个变体的区别(原始的第二个变体甚至不会编译)。
现在,您想要使用哪一个主要取决于您的个人偏好。第一个变体使"短"类型名称的版本(仅Except_Frame
)早于第二个版本。
答案 3 :(得分:0)
首先我们需要了解typedef的用法; typedef可用于表示变量如何表示某事物;实施例
typedef int km_per_hour ;
typedef int points ;
现在,来看你的情况,你正在定义结构,你希望它通过某种东西来调用typedef;我们需要在使用之前对它进行PREDEFINE,因此我们在定义struct
之前声明1 typedef struct Except_Frame t_Except_Frame;
2 struct Except_Frame {
3 t_Except_Frame *prev;
4 ...
5 }
第1行)现在编译器理解将存在名称为“struct Except_Frame”的结构,我们需要将typedef设置为“t_Except_Frame”;你注意到我为typedef添加了t_;遵循这一点是一个好习惯,这样程序员就可以很容易地理解这个值是typedef;
第3行)系统理解它是struct Except_Frame的typedef变量并相应地编译程序。