指向接受const和非const参数的函数的指针

时间:2015-10-03 09:13:41

标签: c unix pointers

我想为read和write unix函数编写一个包装器,但read有一个const void指针参数,并写一个简单的void指针作为参数。

因此,像这样的原型,其中一个功能会失败:

typedef ssize_t (*genericStreamHandler)(int, const void*, size);

1 个答案:

答案 0 :(得分:2)

如果代码需要允许不兼容的函数,请不要对函数签名进行原型设计。

以下编译没有警告/错误。

#include <stdio.h>

ssize_t file_read(int h, const void* b, int sz) {
  if (b) return 0;
  return h + sz;
}

ssize_t file_write(int h, void* b, int sz) {
  if (b) return 0;
  return h + sz;
}

//typedef ssize_t (*genericStreamHandler)(int, void*, int);
//                                      v--- No function prototype
typedef ssize_t (*genericStreamHandler)();

int main(void) {
  genericStreamHandler gFH1 = file_read;
  genericStreamHandler gFH2 = file_write;
  char buf[10];
  return (*gFH1)(0, buf, 10) + (*gFH2)(0, buf, 10);
}

OTOH,更好的答案可能在于采用另一种方法,不需要变体函数签名的通用类型。