你能声明一个命名结构的匿名实例吗?

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 ...

有两种基本方法,略有技巧:

  1. 使用包含文件(例如):generic.h
  2. 使用 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;