首先关闭令我难以置信的代码:
typedef struct Object {
typedef int MyInt;
void (*destructor)(Object *);
void *(*constructor)(struct Object *);
} Object;
为什么编译器阻止我在struct中定义typedef?
答案 0 :(得分:7)
这是不允许的。 C ++ 类允许类似的东西,但在标准C中不允许。
答案 1 :(得分:5)
在C语言中,struct
内的每个声明都必须声明一个数据字段(可能是未命名的)。这意味着可以在C中的struct
内定义类型,只要新类型声明作为数据字段声明的一部分嵌入即可。例如
struct Outer {
struct Inner {
int i;
} field;
};
struct Outer a;
a.field.i = 42;
在上面的示例中,类型struct Inner
在类型struct Outer
内声明。但是,“嵌套”struct Inner
类型声明在struct Outer
内没有任何本地化。它仍然具有文件范围,因为C语言没有struct
范围。这意味着您仍然可以使用struct Inner
作为同一文件范围的成员
struct Inner b;
b.i = 42;
同时,这个技巧不适用于typedef
声明,因为typedef
声明不声明数据字段。
请注意,本着C语言的精神,即使您的typedef
声明在某种程度上是合法的,它仍然会声明一个带有文件范围的typedef名称MojInt
。即它的行为与您在typedef
之前放置struct
声明的行为完全相同。
答案 2 :(得分:1)
我不知道在C ++中是允许的,但我可以肯定地说我没见过香草C编译器接受该构造。
这是一个可浏览的C99语法,可能有望清除混淆:http://slps.github.io/zoo/c/iso-9899-tc3.html
检查1998 C ++语法以进行比较:http://slps.github.io/zoo/cpp/iso-14882-1998.html