2016-05-01 4 views
0

In C ist dieser Teil des Codes in Ordnung, aber in C++ funktioniert Ich erhalte eine Fehlermeldung:C-Code in C++ nicht kompatibel Parameterfehler

argument of type "void *" is incompatible with parameter of type "FILE *"

Wie kann ich es beheben? Dies ist der relevante Teil des Codes:

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; 

    } 

Die Lösung war einfach tatsächlich in der end.So wenn es jemand hilft ich einfach leer geändert * mit FILE * ptr und FILE * stream und es funktionierte

+1

Wenn Sie Französisch mit einem Engländer sprechen, bekommen Sie das gleiche Problem. C und C++ sind verschiedene Sprachen –

+2

Mögliches Duplikat von [void pointers: Unterschied zwischen C und C++] (http://stackoverflow.com/questions/1736833/void-pointers-difference-between-c-and-c) – Jfevold

+1

Im Allgemeinen Es ist eine schlechte Idee, C-Code mit einem C++ - Compiler zu kompilieren. Dafür sind C-Compiler da. –

Antwort

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

Das ist die schnelle und dreckige Antwort. Meine Frage wäre, wenn ptr immer ein Zeiger auf eine FILE ist, warum deklarieren Sie den Parameter als void *?

void pointers: difference between C and C++ hat alle Erklärungen, die Sie jemals wünschen könnten. Ich habe diese Frage als Duplikat markiert, wollte Sie aber kurzfristig über diesen Buckel bringen.

+2

Können Sie Ihre Antwort ein bisschen mehr erklären, anstatt nur ein Code-Snippet zu posten? Dies trägt dazu bei, qualitativ hochwertige Antworten auf SO zu gewährleisten. Vielen Dank! – winhowes

3

C ermöglicht die automatische Konvertierungen zwischen void* und Zeiger der anderen Typen:

6.3.2.3 Pointers

1 A pointer to void may be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer.

Daher ist es OK ist ptr in einem Aufruf an eine Funktion zu verwenden, die eine FILE* erwartet.

C++ erlaubt die automatische Umwandlung von Zeigern anderer Typen zu void*, aber es erlaubt keine automatische Umwandlung von void* zu Zeigern anderer Typen.

Daher erhalten Sie den Compiler-Fehler.

+0

@Raven, Ich bin froh zu hören, dass Sie eine Lösung haben. –

Verwandte Themen