【问题标题】:C code in C++ incompatible parameter errorC++中的C代码不兼容参数错误
【发布时间】:2016-08-26 01:06:21
【问题描述】:

在 C 中这部分代码工作正常,但在 C++ 中我得到一个错误:

“void *”类型的参数与“FILE”类型的参数不兼容 *"

我该如何解决?这是代码的相关部分:

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
    {

        curl_off_t nread;

        size_t retcode = fread(ptr, size, nmemb, stream); /*i get an error on this line on stream */

        nread = (curl_off_t)retcode;

        fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
            " bytes from file\n", nread);
        return retcode;

    }

最终解决方案实际上很简单。因此,如果它对任何人有帮助,我只需将 void* 更改为 FILE *ptr 和 FILE *stream 就可以了

【问题讨论】:

  • 与英国人说法语时,您会遇到同样的问题。 C 和 C++ 是不同的语言
  • 一般来说,用 C++ 编译器编译 C 代码是个坏主意。这就是 C 编译器的用途。

标签: c++


【解决方案1】:
   size_t retcode = fread((FILE*)ptr, size, nmemb, stream); /*i get an error on this line on stream */

这是快速而肮脏的答案。我的问题是,如果 ptr 始终是指向 FILE 的指针,那么为什么要将参数声明为 void*?

void pointers: difference between C and C++ 拥有您可能想要的所有解释。我已将此问题标记为重复问题,但希望能在短期内帮助您度过难关。

【讨论】:

  • 您能否解释一下您的答案,而不仅仅是发布代码 sn-p?这有助于确保跨 SO 的高质量答案。谢谢!
【解决方案2】:

C 允许在void* 和其他类型的指针之间进行自动转换:

6.3.2.3 指针

1 指向 void 的指针可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。指向任何对象类型的指针都可以转换为指向 void 的指针并再次返回;结果应与原始指针比较。

因此,可以在调用需要 FILE* 的函数时使用 ptr

C++ 允许从其他类型的指针自动转换为void*,但它不允许从void* 自动转换为其他类型的指针。

因此你得到编译器错误。

【讨论】:

  • @Raven,很高兴听到您有解决方案。
猜你喜欢
  • 2015-09-30
  • 2014-04-09
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多