所以我有两个不同的结构,其中我将访问的所有属性都是相同的。我也有一个功能,谁的论点,我希望能够接受两者中的任何一个。例如:
typedef struct{
int whatnot = 14;
int thing[11];
} TH_CONFIG;
typedef struct{
int whatnot = 3;
int thing[5];
} TH_CONFIG_2;
*_CONFIG var;
void fun(*_CONFIG input)
{
input.whatnot = 5;
}
int main(){
fun(var);
}
我可能有一个暗示,我应该使用void作为我可以类型转换的类型?但是我的搜索只产生了关于函数指针,模板和C#的东西。
编辑:* _CONFIG并不意味着语法正确,它表示我不知道该怎么做,但它应该是_CONFIG类型
答案 0 :(得分:2)
可能的解决方案。
只需传递您关心的struct
的参数。
void fun(int * whatnot){ * whatnot = 5; }
int main(){ 有趣(放; myStruct.whatnot); 返回0; }
考虑准OO设计。
struct { int whatnot; } typedef Common;
struct TH_CONFIG_1 { 常见的; int thing [11]; };
struct TH_CONFIG_2 { 常见的; int thing [5]; }
但如果你坚持......
void fun(void* input) {
( (int)(*input) ) = 5;
}
...或
void fun(void* input) {
( (TH_CONFIG*) input)->whatnot = 5; // may have been a TH_CONFIG_2, but who cares?
}
注意:这不会在任何C商店通过代码审查。
答案 1 :(得分:1)
您可以使用任何指针类型并进行投射。
如果您访问的所有属性都相同,我猜测一个属性是另一个属性的扩展(因为属性需要从结构的开头具有相同的偏移量)。在这种情况下,您可能想要使用此模式:
struct base {
int foo;
char **strings;
};
struct extended {
struct base super;
double other_stuff;
};
由于super
位于struct extended
的开头,您可以毫无问题地将struct extended *
投射到struct base *
。当然,你可以通过在struct extended
的开头重复相同的字段来做到这一点,但是你会重复自己。