首先关闭令我难以置信的代码:
typedef struct Object {
typedef int MyInt;
void (*destructor)(Object *);
void *(*constructor)(struct Object *);
} Object;
Run Code Online (Sandbox Code Playgroud)
为什么编译器阻止我在struct中定义typedef?
在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.