Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构中的Typedef_C_Struct_Typedef - Fatal编程技术网

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;
在上面的示例中,type
struct internal
在type
struct 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++类之间的区别。这比一些人想象的要实际得多。