在C结构中的Typedef

时间:2013-12-02 19:27:56

标签: c struct typedef

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

typedef struct Object {
    typedef int MyInt;
    void (*destructor)(Object *);
    void *(*constructor)(struct Object *);
} Object;

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

3 个答案:

答案 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