我有两个具有以下签名的功能:
int f1(void* data);
和
int f2(const void* data);
然后我这样做:
int (*f) (void*) = f2;
E.g。我需要一个指针类型来引用这两个函数。但是,由于删除了const修饰符,我收到警告。那有什么办法吗? (我不能改变f1和f2签名)
让我解释为什么我需要这个。问题是我正在为read()和write()系统调用编写包装器,我注意到除了调用read()或write()之外,它们都是相同的。所以我决定制作一个包装函数并使用指针传递所需的函数。因此,只需摆脱复制粘贴。现在我不确定这是不是一个好主意。
答案 0 :(得分:0)
工会是否有效?
union generic_void
{
void *data;
void const *const_data;
} generic_void_t;
int (*f) (generic_void_t) = f1;
int (*f) (generic_void_t) = f2;
答案 1 :(得分:0)
f1
anf f2
具有不同的签名,并且创建能够获取任一值的指针很容易出现未定义的行为。
我需要一个指针类型来引用这两个函数。 ......有什么方法吗?
不要在函数指针参数中包含签名。
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)
。守则悬而未决。