嵌套的 typedef 结构

Nested typedef structs

我在尝试嵌套需要声明为新 var 类型的结构时遇到问题。代码如下-

typedef struct
{
    typedef struct
    {
        int day,
            month,
            year;
    } Date;

    Date manuDate,
         purDate;
    double purPrice;
} Car;

除了当我尝试编译时它向我抛出一个错误说

"Syntax error before typedef" 以及其他一些错误。

这是C做不到的吗?我知道没有指针的嵌套结构存在问题,但我不确定在这种情况下如何工作...

C 不支持嵌套结构定义。也许您正在查看一些 C++ 代码。

相反,您只需先定义 "inner" 结构,然后在 "outer" 结构中引用它。

typedef struct
{
    int day,
        month,
        year;
} Date;


typedef struct
{
    Date manuDate,
         purDate;
    double purPrice;
} Car;

它不起作用,因为那完全是 OOP 功能。 C 不是面向对象的。如果您从内部结构中删除 'typedef' 并将其在 'inner' 声明中的使用替换为 'void*',它将编译。因此,如果您想进行疯狂的 OOP 样式嵌套,您将不得不利用您的 'void*' - 在 C 中没有其他方法可以做到这一点。

如果你真的想做嵌套的东西,你将不得不删除 typedef。 您可以做的是使用未命名的结构在主结构中创建结构化变量。

示例:

typedef struct ObjectType {
    float width;
    float height;
    float x;
    float y;

    //Nested Struct
    struct {
        float r;
        float g;
        float b;
        float a;
    } color; //color is a variable

} Object;

C确实支持嵌套结构,只是不能在外部引用嵌套结构。

typedef struct
{
    typedef struct Date
    {
        int day,
            month,
            year;
    } manuDate, purDate;

    double purPrice;
} Car;


Car car;

car.manuDate.year = 2020;
car.manuDate.month = 1;
car.manuDate.day = 1;
car.purDate.year = 2020;
car.purDate.month = 2;
car.purDate.day = 14;


car.purPrice = 15000.00;

我刚刚在 1996 年的 C 编译器 (VisualAge C) 上尝试过,它运行良好。

C 确实有嵌套 structs/unions/enums 但没有嵌套 typedef。

struct A { typedef struct B { int x; } B; }; //WRONG
struct A { struct { int x; } b; }; //OK - an anonymous nested struct w/ an instance
struct A { struct { int x; }; }; //OK - an anonymous nested struct w/out an instance; x effectively belongs to `struct A`
struct A { struct B { int x; } b; }; //OK, the `struct B` type also becomes available in the outer scope
struct A { struct B { int x; }; }; //WRONG, an tagged nested struct needs at least 1 instance

嵌套的 structs/unions/enums 可以是匿名的(未标记),在这种情况下它们成为外部 struct/union 的一部分或标记。

匿名内部 struct/union 也可以在不定义实例的情况下逃脱,在这种情况下,内部成员递归地成为外部 struct/union 的成员。

标记嵌套 struct/union/enum 需要实例,它就像一个匿名嵌套 struct/union/enum 实例,除了标记类型也可以供以后使用,就像它是独立的一样outer-scope struct/union/枚举定义。

将标记的 struct/union/enum 简单地放在外部范围内而不是将其混淆地嵌套在另一个 struct/union.

中可能是明智的

我遇到了同样的问题;我只是使用指针来访问我的 typedef 结构; 我使用了 Glib/Gtk+ 开发平台 第二部分 - C 中的面向对象编程

//*lul.h
typedef struct _lultype {
    char **lularray; 
} lultype;

typedef struct _lul { 
    lultype *mylul;   //pointer to lultype struct
 } lulmon_t;

 //*lul.c
 lulmon *initialize_lul () {
    lulmon_t *lulmon = malloc(sizeof(lulmon_t));
    lulmon->mylul = malloc(sizeof(lultype)); 
    lulmon->mylul->lularray = calloc(8, sizeof(char)); 
    return lulmon; // returns the address of lulmon. 
 }

 // main.c

 int main() {
    lulmon *lulmon = initialize_lul(); 
    /* store characters inside my lularray */
    *(lulmon->mylul->lularray + 0) = 0x01;
    *(lulmon->mylul->lularray + 1) = 0x02;
     lulmon->mylul->lularray[2] = 0x03; //alternative way of accessing index
    return 0; 
 }