嵌套的typedef结构

时间:2015-05-04 00:09:05

标签: c ansi-c

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

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

    Date manuDate,
         purDate;
    double purPrice;
} Car;

除非我尝试编译它,否则会向我说错误

“typedef之前的语法错误”以及由此导致的一系列其他错误。

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

5 个答案:

答案 0 :(得分:3)

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

相反,您只需定义"内部"首先是struct,然后在" outer"中引用它。结构

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


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

答案 1 :(得分:1)

C确实具有嵌套的结构/联合/枚举,但没有嵌套的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

嵌套的结构/联合/枚举可以是匿名的(未标记),在这种情况下,它们将成为外部结构/联合的一部分或已标记。

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

带标签的嵌套struct / union / enum需要实例,就像带实例的匿名嵌套struct / union / enum一样,除了带标签的类型也可供以后使用,表现为它是独立的外部作用域struct / union。 /枚举定义。

明智的做法是将标记的struct / union / enum放在外部作用域中,而不是将其混淆嵌套在另一个struct / union中。

答案 2 :(得分:0)

它不起作用,因为严格来说这是OOP功能。 C不是OO。如果从内部结构中删除'typedef'并将其在'inner'声明中的使用替换为'void *',它将进行编译。因此,如果您要进行疯狂的OOP样式嵌套,则必须利用'void *'-在C语言中没有其他方法可以实现。

答案 3 :(得分:-1)

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年(VisualAge C)的C编译器上尝试过,并且效果很好。

答案 4 :(得分:-1)

我遇到了同样的问题;我只是使用指针来访问我的 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; 
 }