需要关于C中函数指针的建议吗
我有两个具有以下签名的函数:需要关于C中函数指针的建议吗,c,function-pointers,C,Function Pointers,我有两个具有以下签名的函数: int f1(void* data); 及 然后我会这样做: int (*f) (void*) = f2; 例如,我需要一个指针类型来引用这两个函数。但是,由于删除了const修饰符,我得到了一个警告。有什么办法吗?(我无法更改f1和f2签名) 让我解释一下为什么我需要这个。问题是我在为read()和write()系统调用编写包装,我注意到除了对read()或write()的调用之外,这两个系统调用都是相同的。所以我决定制作一个包装器函数,并使用指针传递所需的函
int f1(void* data);
及
然后我会这样做:
int (*f) (void*) = f2;
例如,我需要一个指针类型来引用这两个函数。但是,由于删除了const修饰符,我得到了一个警告。有什么办法吗?(我无法更改f1和f2签名)
让我解释一下为什么我需要这个。问题是我在为read()和write()系统调用编写包装,我注意到除了对read()或write()的调用之外,这两个系统调用都是相同的。所以我决定制作一个包装器函数,并使用指针传递所需的函数。所以,这一切只是为了摆脱复制粘贴。现在我不确定这是否是个好主意。工会有效吗
union generic_void
{
void *data;
void const *const_data;
} generic_void_t;
int (*f) (generic_void_t) = f1;
int (*f) (generic_void_t) = f2;
工会在运作吗
union generic_void
{
void *data;
void const *const_data;
} generic_void_t;
int (*f) (generic_void_t) = f1;
int (*f) (generic_void_t) = f2;
f1
anff2
具有不同的签名,并且创建能够获取任一值的指针容易出现未定义的行为
我需要一个指针类型来引用这两个函数。。。有什么办法吗
不要在函数指针参数中包含签名
int f1(void* data);
int f2(const void* data);
int fooy(void) {
int (*fp1)() = f1;
int (*fp2)() = f2;
void* data1;
const void* data2;
return (*fp1)(data1) + (*fp2)(data2);
}
这会破坏
(*fp1)(data1)+(*fp2)(data2)
中的类型检查,因为代码可以调用(*fp1)(data2)
或(*fp2)(1,2,3)
。代码就在悬崖上。f1
anff2
具有不同的签名,并且创建能够获取任一值的指针容易出现未定义的行为
我需要一个指针类型来引用这两个函数。。。有什么办法吗
不要在函数指针参数中包含签名
int f1(void* data);
int f2(const void* data);
int fooy(void) {
int (*fp1)() = f1;
int (*fp2)() = f2;
void* data1;
const void* data2;
return (*fp1)(data1) + (*fp2)(data2);
}
这会破坏
(*fp1)(data1)+(*fp2)(data2)
中的类型检查,因为代码可以调用(*fp1)(data2)
或(*fp2)(1,2,3)
。代码就在悬崖上。您可能可以制作一个intf3(void*data)
,直接交给f2。这对你有用吗?@johncleman:这是一个糟糕的建议,没有进一步的信息给初学者。使用包装器是胡说八道。相同/相似的签名并不意味着相同的语义(正如const
明确暗示的那样)。为什么要对同一个参数动态使用这两个函数?您只是混淆了代码,最终在调试或扩展时遇到了麻烦。注意:写fread
或myreadfunction
有什么区别?@Olaf谢谢,我收到了你的point@JohnColeman当前位置1)其他人也会阅读此内容。2) 我不同意,否则OP会知道这意味着什么3)看看他似乎想要完成什么。4) 这是一个寻找问题或XY问题的(不好的)解决方案。您可以制作一个int f3(void*data)
,直接交给f2。这对你有用吗?@johncleman:这是一个糟糕的建议,没有进一步的信息给初学者。使用包装器是胡说八道。相同/相似的签名并不意味着相同的语义(正如const
明确暗示的那样)。为什么要对同一个参数动态使用这两个函数?您只是混淆了代码,最终在调试或扩展时遇到了麻烦。注意:写fread
或myreadfunction
有什么区别?@Olaf谢谢,我收到了你的point@JohnColeman当前位置1)其他人也会阅读此内容。2) 我不同意,否则OP会知道这意味着什么3)看看他似乎想要完成什么。4) 这是寻找问题或XY问题的(糟糕的)解决方案。