需要关于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
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)
。代码就在悬崖上。

f1anff2具有不同的签名,并且创建能够获取任一值的指针容易出现未定义的行为

我需要一个指针类型来引用这两个函数。。。有什么办法吗

不要在函数指针参数中包含签名

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问题的(糟糕的)解决方案。