这个C结构定义的优点是什么?

时间:2015-07-30 05:26:54

标签: c struct typedef

我不太明白为什么这种结构是这样定义的。

这是有问题的代码块......

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;

有什么好处?

4 个答案:

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

如果要在一个语句中定义structtypedef,它将是:

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变量并相应地编译程序。