嵌套的 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;
}
我在尝试嵌套需要声明为新 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;
}