无法编译 ftpupload.c

Can't compile ftpupload.c

我正在尝试使用命令 g++ -o program ftpupload.c 编译 ftpupload.c,但出现以下错误:

ftpupload.c: In function ‘size_t read_callback(char*, size_t, size_t, void*)’:
ftpupload.c:57:50: error: invalid conversion from ‘void*’ to ‘FILE* {aka _IO_FILE*}’ [-fpermissive]
   size_t retcode = fread(ptr, size, nmemb, stream);
                                                  ^
In file included from ftpupload.c:22:0:
/usr/include/stdio.h:646:15: note:   initializing argument 4 of ‘size_t fread(void*, size_t, size_t, FILE*)’
 extern size_t fread (void *__restrict __ptr, size_t __size,
               ^~~~~

添加显式转换:

size_t retcode = fread(ptr, size, nmemb, (FILE *)stream);

C++在指针转换方面比C更严格

首先,您尝试使用 C++ 编译器编译 C 文件。所以你必须使用 gcc 命令而不是 g++。编译器报告属于类型转换。流变量必须转换为 FILE*.

这是将 C 源文件编译为 C++。 C++ 在涉及隐式转换时更加严格,并且不允许从 void* 到任何其他指针 (source) 的隐式转换:

Pointer to object of any type can be implicitly converted to pointer to void (optionally cv-qualified); the pointer value is unchanged. The reverse conversion, which requires static_cast or explicit cast, yields the original pointer value: [..]

要解决此问题,请使用 C 编译器或添加强制转换:

size_t retcode = fread(ptr, size, nmemb, static_cast<FILE*>(stream));

不推荐,但如果此行需要双语 C 和 C++,您可以使用 C 风格的转换:

size_t retcode = fread(ptr, size, nmemb, (FILE*) stream);

附带说明:ftpupload.c 不包含独立程序,即使使用转换也不会完全编译。最佳解决方案取决于您首先要编译此文件的原因。