C泛型类型作为函数参数输入
所以我有两个不同的结构,其中我要访问的所有属性都是相同的。我还有一个函数,是谁的参数,我希望能够接受两者中的任何一个。例如:C泛型类型作为函数参数输入,c,function,types,struct,arguments,C,Function,Types,Struct,Arguments,所以我有两个不同的结构,其中我要访问的所有属性都是相同的。我还有一个函数,是谁的参数,我希望能够接受两者中的任何一个。例如: 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) {
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类型的可能解决方案
struct
的参数即可
虚无乐趣(int*whatnot){
*whatnot=5;
}
int main(){
乐趣(我的结构等等);
返回0;
}void fun(void* input) {
( (int)(*input) ) = 5;
}
或者
注意:这不会通过任何C商店的代码审查。可能的解决方案
struct
的参数即可
虚无乐趣(int*whatnot){
*whatnot=5;
}
int main(){
乐趣(我的结构等等);
返回0;
}void fun(void* input) {
( (int)(*input) ) = 5;
}
或者
注意:这不会通过任何C商店的代码审查。您可以使用任何指针类型并强制转换它 如果您访问的所有属性都相同,我猜其中一个是另一个的扩展(因为属性需要与结构的开头具有相同的偏移量)。在这种情况下,您可能需要使用此模式:
struct base {
int foo;
char **strings;
};
struct extended {
struct base super;
double other_stuff;
};
由于
super
位于struct extended
的开头,因此可以将struct extended*
强制转换为struct base*
。当然,您可以通过重复struct extended
开头的相同字段来实现这一点,但随后您会重复自己的操作。您可以使用任何指针类型并强制转换它
如果您访问的所有属性都相同,我猜其中一个是另一个的扩展(因为属性需要与结构的开头具有相同的偏移量)。在这种情况下,您可能需要使用此模式:
struct base {
int foo;
char **strings;
};
struct extended {
struct base super;
double other_stuff;
};
由于
super
位于struct extended
的开头,因此可以将struct extended*
强制转换为struct base*
。当然,您可以通过重复struct extended
开头的相同字段来实现这一点,但随后您会重复自己的操作。void fun(*\u CONFIG input)
-这是一个语法错误。您可能需要了解。这两个结构不兼容;int whatnot=3代码>符号不是有效的C;*\u配置变量代码>不是有效的C;void fun(*\u CONFIG input)
是无效的C。通常,函数只能在一种类型上工作;否则,它缺乏功能凝聚力。如果必须,您可以通过void*
和其他标识void*
所指类型的内容来传递值。或者您可以使用类型的联合。您甚至可以使用.whatnot
成员来确定您正在处理的类型,如果联合中的所有类型都有该成员并且该成员包含单独的值。void fun(*\u CONFIG input)
-这是一个语法错误。您可能需要了解。这两种结构不兼容;int whatnot=3代码>符号不是有效的C;*\u配置变量代码>不是有效的C;void fun(*\u CONFIG input)
是无效的C。通常,函数只能在一种类型上工作;否则,它缺乏功能凝聚力。如果必须,您可以通过void*
和其他标识void*
所指类型的内容来传递值。或者您可以使用类型的联合。您甚至可以使用.whatnot
成员来确定您正在处理的类型,如果联合中的所有类型都存在该成员,并且该成员包含一个单独的值。它们实际上是相同的结构,但具有不同的值和数组长度,我无法真正malloc,需要硬编码。它们实际上是相同的结构,但是由于数组的值和长度不同,我不能真正使用malloc,需要进行硬编码。是的。不能3。四号。不能5。争论太多了,但还是要感谢你第一个不屈不挠的建议。我想这真的解决不了问题吗?我仍然有两个不同的结构没有被输入到一个函数中。不过我可能错了。继续:谢谢你的最后一个建议,这个代码没有被审查。@DanielCardin to be fair 3是唯一屈尊的建议。我很惊讶你的内存如此紧张,对于那些认为自己内存或CPU有限但实际上只是过早优化的人来说,有99对1的问题,所以我必须在这方面努力。你会得到