C 如果两个结构具有本质上相同的结构,则取消一个结构定义

C 如果两个结构具有本质上相同的结构,则取消一个结构定义,c,C,我有两个具有相同结构的物理实体。处理这种情况的理想方法是什么 例如: struct graphlet_vector { int a; int* data; } struct group_vector { int a; int *data; } 组向量定义为一定范围内的聚合图向量,因此结构在一段时间内必须保持不变。因此,对于同一事物有两种结构似乎是多余的 我不能用这样的东西: typedef struct graphlet_vec struct group_ve

我有两个具有相同结构的物理实体。处理这种情况的理想方法是什么

例如:

struct graphlet_vector {
    int a;
    int* data;
}

struct group_vector {
    int a;
    int *data;
}
组向量定义为一定范围内的聚合图向量,因此结构在一段时间内必须保持不变。因此,对于同一事物有两种结构似乎是多余的

我不能用这样的东西: typedef struct graphlet_vec struct group_vec尽管以下各项工作正常:typedef struct graphlet_vec group_vec


有什么建议吗?

如果您真的希望它们是相同的类型,可以使用两个typedef:

struct g_vector { /* ... */ };
typedef struct g_vector graph_vector;
typedef struct g_vector group_vector;
如果您更喜欢将类型称为struct graph_vector和struct group_vector,而不是每个类型都使用一个标识符,那么没有真正干净的方法可以做到这一点struct foo和struct bar始终是不同的类型-但是您可以使用预处理器:

struct g_vector { /* ... */ };
#define graph_vector g_vector
#define group_vector g_vector
另一方面,你应该考虑你是否真的希望他们是同一类型。他们有不同的名字,所以他们对你显然有不同的意义;否则,您将定义单个类型。是否会有代码可以对任何一种类型的对象进行操作?如果没有,请将它们区分开来


如果您想在某些情况下将它们视为不同的类型,但在其他情况下将它们视为相同的类型,那么这就有点棘手了。您可以将它们定义为相同的类型,并注意不要混淆操作,如果希望它们是不同的,则会丢失一些编译时类型检查。或者您可以将它们定义为不同的类型,并使用void*实现公共函数。或者,你可以从C++切换到C++,并使用类继承从公共父类型派生它们。我看没什么问题otherwise@EsaLakaniemi只是一个我到处都遵循的惯例。我很想知道是否有其他方法来执行它。如果这两件事在概念上或语义上不同,请将它们分开,不要担心冗余。如果需要表示两个复合类型,则将它们表示为两个不同的类型。事实上,他们有相同的内部代表性与这一决定并不密切相关。您的问题表明您希望继续使用两个不同的名称,因此在头中键入两个小型结构定义的麻烦是微不足道的。结构定义在编译后无论如何都会消失,因此您没有保存任何实际资源。@PaulGriffiths能否详细说明编译后结构定义消失的原因/方式?@AmanDeepGautam,因为机器代码没有结构,只有指令和数据字节。结构定义只是告诉编译器如何表示数据,一旦表示在已编译的可执行文件中变得具体,定义就达到了目的,不再相关。