0

我需要将 PDF 输出到文件描述符,我正在考虑使用 Cairo 和cairo_pdf_surface_create_for_stream()

我有一个写函数,它有这个签名:

static cairo_status_t cairowrite(void *fp, unsigned char const *data, unsigned int length);

它返回CAIRO_STATUS_SUCCESS

现在,我如何将此函数作为回调传递?

我试过这个:

cairo_write_func_t (*wfunc)(void *, unsigned char const *, unsigned int);
wfunc = (cairo_write_func_t)&cairowrite;
surface = cairo_pdf_surface_create_for_stream((cairo_write_func_t)wfunc, fp, (double)realwidth, (double)realwidth);

但是我收到了编译器警告:warning: assignment from incompatible pointer type在我做的那一行wfunc = &cairowrite;

我究竟做错了什么?

回调函数给出了这个 gcc 错误:cairo_status_t但必须是 type cairo_write_func_t

使用铿锵声我得到这个错误:

qrencode.c:250:11: warning: incompatible pointer types assigning to 'cairo_write_func_t (*)(void *, unsigned char const *, unsigned int)' from
      'cairo_write_func_t' (aka 'cairo_status_t (*)(void *, unsigned char const *, unsigned int)')
    wfunc = (cairo_write_func_t)&cairowrite;
          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

我该怎么办?

4

2 回答 2

0

您可以尝试使用定义函数指针

cairo_status_t (*wfunc)(FILE *, unsigned char *, unsigned int) = &cairowrite;

例子:

#include <iostream>

int funp(int a, int b) {
  return a + b;
}

int call(int a, int b, int (*ptr)(int, int)) {
  int result = ptr(a, b);
  return result;
}

int main() {
  int (*ptr)(int, int) = &funp;
  int r = call(3, 5, ptr);
  std::cout << "Result " << r << std::endl;
  return 0;
}

输出:

Result 8
于 2011-03-16T10:31:14.143 回答
0

问题解决了!

我有函数定义:

static cairo_status_t cairowrite(void *fh, unsigned char const *data, unsigned int length);

这就是我传递回调的方式:

surface = cairo_pdf_surface_create_for_stream((cairo_write_func_t)cairowrite, fp, (double)realwidth, (double)realwidth);

我不再使用中间函数指针。clang 和 gcc 不会给出任何错误。

于 2011-03-16T20:28:45.340 回答