你能声明一个命名结构的匿名实例吗?
Can you declare an anonymous instance of a named struct?
我正在尝试通过创建通用结构在 C 中手动实现多态行为,然后 派生结构 (如果你愿意的话)可以通过值来区分一个枚举,这样我就可以有一个指向泛型类型的指针,将它作为泛型类型取消引用,弄清楚它是什么类型,然后将它作为更具体的类型取消引用。
typedef struct{
enum type structType;
//... other stuff all the structs share
}generic;
typedef struct{
generic; //does not work, obviously, nor does (generic){};
//... other stuff unique to struct type A
}typeA;
我知道我可以在派生结构中声明通用结构的命名实例,但这看起来有点混乱,如果有一种简洁明了的方法,我宁愿不要这样做。
Can you declare an anonymous instance of a named struct?
没有
然而,代码可以根据行号组成一个名称,以保持其唯一性并带有一定程度的敌意。
现在代码不应尝试引用 var.member11
,因为随着 typeA
定义的代码在文件中移动,成员名称也会发生变化。
#define ANON_1(A,B) A##B
#define ANON_2(A,B) ANON_1(A,B)
#define ANON ANON_2(member, __LINE__)
typedef struct{
int x;
} generic;
typedef struct{
generic ANON; // name will be something like: member10
generic ANON; // name will be something like: member11
int y;
} typeA;
int main() {
typeA var;
(void) var;
return 0;
}
我怀疑虽然要实现 OP 的更高目标,但可能有更好的方法。
You can't always get what you want, but if you try sometimes, well, you might find, you get what you need ...
有两种基本方法,略有技巧:
- 使用包含文件(例如):
generic.h
- 使用 CPP 宏(例如):
GENERIC
我曾多次使用过这两种方法。
这是包含文件 (generic.h
) 的方法:
enum type structType;
int com_fd;
void *com_buf;
而且,这是一个使用它的 .c
文件:
typedef struct {
#include <generic.h>
} generic;
typedef struct {
#include <generic.h>
// other stuff unique to struct type A ...
int typea_value;
} typeA;
下面是使用宏的方法:
#define GENERIC \
enum type structType; \
int com_fd; \
void *com_buf
typedef struct {
GENERIC;
} generic;
typedef struct {
GENERIC;
// other stuff unique to struct type A ...
int typea_value;
} typeA;
我正在尝试通过创建通用结构在 C 中手动实现多态行为,然后 派生结构 (如果你愿意的话)可以通过值来区分一个枚举,这样我就可以有一个指向泛型类型的指针,将它作为泛型类型取消引用,弄清楚它是什么类型,然后将它作为更具体的类型取消引用。
typedef struct{
enum type structType;
//... other stuff all the structs share
}generic;
typedef struct{
generic; //does not work, obviously, nor does (generic){};
//... other stuff unique to struct type A
}typeA;
我知道我可以在派生结构中声明通用结构的命名实例,但这看起来有点混乱,如果有一种简洁明了的方法,我宁愿不要这样做。
Can you declare an anonymous instance of a named struct?
没有
然而,代码可以根据行号组成一个名称,以保持其唯一性并带有一定程度的敌意。
现在代码不应尝试引用 var.member11
,因为随着 typeA
定义的代码在文件中移动,成员名称也会发生变化。
#define ANON_1(A,B) A##B
#define ANON_2(A,B) ANON_1(A,B)
#define ANON ANON_2(member, __LINE__)
typedef struct{
int x;
} generic;
typedef struct{
generic ANON; // name will be something like: member10
generic ANON; // name will be something like: member11
int y;
} typeA;
int main() {
typeA var;
(void) var;
return 0;
}
我怀疑虽然要实现 OP 的更高目标,但可能有更好的方法。
You can't always get what you want, but if you try sometimes, well, you might find, you get what you need ...
有两种基本方法,略有技巧:
- 使用包含文件(例如):
generic.h
- 使用 CPP 宏(例如):
GENERIC
我曾多次使用过这两种方法。
这是包含文件 (generic.h
) 的方法:
enum type structType;
int com_fd;
void *com_buf;
而且,这是一个使用它的 .c
文件:
typedef struct {
#include <generic.h>
} generic;
typedef struct {
#include <generic.h>
// other stuff unique to struct type A ...
int typea_value;
} typeA;
下面是使用宏的方法:
#define GENERIC \
enum type structType; \
int com_fd; \
void *com_buf
typedef struct {
GENERIC;
} generic;
typedef struct {
GENERIC;
// other stuff unique to struct type A ...
int typea_value;
} typeA;