C结构中的Typedef
首先是让我感到困惑的代码:C结构中的Typedef,c,struct,typedef,C,Struct,Typedef,首先是让我感到困惑的代码: typedef struct Object { typedef int MyInt; void (*destructor)(Object *); void *(*constructor)(struct Object *); } Object; 为什么编译器阻止我在结构中定义typedef?这是不允许的。C++类中允许使用类似的东西,但在标准C.< /P> < P>中不知道C++中允许使用,但我可以肯定地说,我没有看到香草C编译器接受这个构造。
typedef struct Object {
typedef int MyInt;
void (*destructor)(Object *);
void *(*constructor)(struct Object *);
} Object;
为什么编译器阻止我在结构中定义typedef?这是不允许的。C++类中允许使用类似的东西,但在标准C.< /P> < P>中不知道C++中允许使用,但我可以肯定地说,我没有看到香草C编译器接受这个构造。 下面是一个可浏览的C99语法,有望消除混淆:
检查1998 C++语法比较:C语言中的< /P> < P> >在代码>结构> /CODE>中的每个声明都必须声明一个数据字段(可能未命名)。这意味着,只要新类型声明作为数据字段声明的一部分嵌入,就可以在C中的
结构中定义类型。比如说
struct Outer {
struct Inner {
int i;
} field;
};
struct Outer a;
a.field.i = 42;
在上面的示例中,typestruct internal
在typestruct Outer
中声明。但是,“嵌套的”struct-Inner
类型声明在struct-Outer
内部没有任何本地化。它仍然有文件作用域,因为C语言没有struct
作用域。这意味着您仍然可以将struct internal
用作同一文件范围的成员
struct Inner b;
b.i = 42;
同时,这个技巧不适用于typedef
声明,因为typedef
声明不声明数据字段
注意,按照C语言的精神,即使您的typedef
声明在某种程度上是合法的,它仍然会声明一个带有文件范围的typedef名称MojInt
。也就是说,如果你在结构> <代码> > < /P>之前放置了< <代码> TyBuffs完全相同,因为C不是C++。我在Windows内核数据结构中发现了类似的东西,我相信它在C@ USER 2533527中,这是不一样的。typedef是在全局范围内的(就像mic4ael的帖子上的第一个),这是合法且相当常见的。我们正在讨论结构中的类型错误。请注意C结构和C++类之间的区别。这比一些人想象的要实际得多。