我在尝试嵌套需要声明为新var类型的结构时遇到问题。代码如下 -
typedef struct
{
typedef struct
{
int day,
month,
year;
} Date;
Date manuDate,
purDate;
double purPrice;
} Car;
除非我尝试编译它,否则会向我说错误
“typedef之前的语法错误”以及由此导致的一系列其他错误。
这是C不能做的事吗?我知道它有嵌套结构的问题而没有指针,但我不确定在这种情况下它是如何工作的......答案 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;
}