在C结构中的Typedef

mic*_*ael 5 c struct typedef

首先关闭令我难以置信的代码:

typedef struct Object {
    typedef int MyInt;
    void (*destructor)(Object *);
    void *(*constructor)(struct Object *);
} Object;
Run Code Online (Sandbox Code Playgroud)

为什么编译器阻止我在struct中定义typedef?

Gui*_*ido 7

这是不允许的.在C++类中允许类似的东西,但在标准C中不允许.


AnT*_*AnT 5

在C语言中,每个声明都struct必须声明一个数据字段(可能是未命名的).这意味着可以struct在C中定义类型,只要新类型声明作为数据字段声明的一部分嵌入即可.例如

struct Outer {
  struct Inner {
    int i;
  } field;
};

struct Outer a;
a.field.i = 42;
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,类型struct Inner是在类型内声明的struct Outer.但是,"嵌套" struct Inner类型声明不以任何方式本地化struct Outer.它仍然具有文件范围,因为C语言没有struct范围这样的东西.这意味着您仍然可以使用struct Inner相同文件范围的成员

struct Inner b;
b.i = 42;
Run Code Online (Sandbox Code Playgroud)

同时,这个技巧不适用于typedef声明,因为typedef声明不声明数据字段.

请注意,本着C语言的精神,即使您的typedef声明在某种程度上是合法的,它仍然会声明一个MojInt带有文件范围的typedef名称.也就是说,它的行为与您在typedef声明之前放置声明的行为完全相同struct.