需要有关C中函数指针的建议

时间:2016-03-14 14:31:14

标签: c function-pointers

我有两个具有以下签名的功能:

int f1(void* data);

int f2(const void* data);

然后我这样做:

int (*f) (void*) = f2;

E.g。我需要一个指针类型来引用这两个函数。但是,由于删除了const修饰符,我收到警告。那有什么办法吗? (我不能改变f1和f2签名)

让我解释为什么我需要这个。问题是我正在为read()和write()系统调用编写包装器,我注意到除了调用read()或write()之外,它们都是相同的。所以我决定制作一个包装函数并使用指针传递所需的函数。因此,只需摆脱复制粘贴。现在我不确定这是不是一个好主意。

2 个答案:

答案 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)。守则悬而未决。