2012-09-02 25 views
9

Mein Compiler-Warnung (gcc) wirft Warnungen (keine Fehler!) Auf der Linie, die fp erklärt:Kann nicht interpretieren Compiler

int fd = open("filename.dat", O_RDONLY); 
FILE* fp = fdopen(fd, "r"); // get a file pointer fp from the file descriptor fd 

Dies sind die Warnungen:

main.c: In function ‘main’: 
main.c:606: warning: implicit declaration of function ‘fdopen’ 
main.c:606: warning: initialization makes pointer from integer without a cast 

Ich verstehe nicht, diese Warnungen seit dem Rückgabewert von ist ein FILE*. Was ist der Fehler, den ich hier mache?

EDIT: Ich bin einschließlich stdio.h (und ich bin auch auf Linux).

+3

Was Sie '# include'-ing? – robert

+0

@robert: stdio.h, stdlib.h, string.h, errno.h, unistd.h, sys/types.h, sys/stat.h, fcntl.h – pap42

+0

Gibt 'man fdopen' irgendwelche Header auf, die Sie nicht haben? – robert

Antwort

11

Kurze Antwort: -std=gnu99 verwendet beim Kompilieren, der üblicher Standard ist nicht POSIX und nicht fdopen hat.


warning: implicit declaration of function ‘fdopen’ 

Bedeutet, dass Sie die Header-Datei vergessen haben zu enthalten, die die Deklaration von fdopen() in residiert dann eine implizite Deklaration durch den Compiler auftritt -. Und das bedeutet der Rückgabewert der unbekannten Funktion wird davon ausgegangen werden sei int - also die zweite Warnung. Sie haben

#include <stdio.h> 

bearbeiten schreiben: Wenn Sie richtig stdio.h sind, dann fdopen() nicht auf dem System verfügbar sein könnten Sie Targeting. Bist du auf Windows? Diese Funktion ist nur POSIX.

Edit 2: Entschuldigung, das hätte ich wirklich sehen sollen. C99 bedeutet den ANSI C99-Standard - und Standard C erzwingt nicht das Konzept der Dateideskriptoren, um Nicht-POSIX-Systeme zu unterstützen, so dass es nur bereitstellt. fdopen() ist mit Dateideskriptoren verwandt, also ist es nur POSIX, also gehört es nicht zum Standard C99. Wenn Sie den -std=gnu99 Switch für GCC verwenden, werden die Einschränkungen des Standards beseitigt und die POSIX- und GNU-only-Erweiterungen werden hinzugefügt, wodurch Ihr Problem im Wesentlichen behoben wird.

+1

Entschuldigung, ich habe vergessen zu erwähnen, dass ich ** bin ** inklusive 'stdio.h' (siehe Bearbeiten). – pap42

+1

@ pap42 Sie könnten Windows verwenden. Wenn das der Fall ist, schlage ich vor, dass Sie aufhören und unterlassen. –

+1

Ich bin eigentlich auf Linux. – pap42

2

Sie schließen #include <stdio.h> in C nicht mit ein und der Compiler "schätzt" daher die Deklaration der Funktion, die Sie aufrufen möchten. (Nehmen Sie die Parameter, die Sie zugrunde gelegt haben, und verwenden Sie int als Rückgabewert). Normalerweise wollen Sie solche Vermutungen nicht, deshalb warnt der Compiler Sie.

Lösung: Ordnungsgemäße #include s hinzufügen.

+0

Entschuldigung, aber diese Antwort ist falsch. Ich schließe 'stdio.h' ein (siehe Bearbeiten). – pap42

+0

In welchem ​​System arbeiten Sie? - POSIX sagt 'fdopen()' muss in 'stdio.h' sein (oder in einer Kopfzeile von stdio.h) - http://pubs.opengroup.org/onlinepubs/007908775/xsh/fdopen.html – johannes

+0

I bin auf Linux (und ich bin gleichermaßen verblüfft über diese Warnung, da ich "stdio.h" einschließe). – pap42

0

Die Funktion fdopen gehört nicht zum C-Standard und ist nicht als Teil der Standard-Header verfügbar, wenn Sie im Standard-C-Modus kompilieren. Sie müssen also entweder -std=gnu99 anstelle von -std=c99 verwenden, um Ihre Quelle zu kompilieren oder die Funktion selbst zu deklarieren.

0

Es gibt eine gute Erklärung für den Compiler Diagnose in @ H2CO3 Antwort, so schauen wir uns nur auf die warum der Dinge: Wenn Sie glibc verwenden (und Sie sind wahrscheinlich), bestimmte POSIX-Funktionen spezifische Funktion erfordern Testmakros zu zeigen.

Insbesondere können Sie die folgende Zeile setzen müssen:

#define _POSIX_SOURCE 
// or #define _XOPEN_SOURCE 

vor

#include <stdio.h> 

Bestimmte Compiler (wie gcc) auch Kommandozeilen-Optionen, um die gleiche Wirkung haben (alle gnu* Standardoptionen in gcc).

+1

Das ist im Prinzip richtig, aber '_POSIX_SOURCE' stammt aus der veralteten frühen 90er-Version des POSIX-Standards. Der moderne Name ist '_POSIX_C_SOURCE' und kann nicht einfach als leere Definition definiert werden. Es muss in der von Ihnen gewünschten Version definiert werden. '200809L' ist der korrekte Wert für den aktuellen Standard. –

1
#define _XOPEN_SOURCE 600 
#include <stdio.h> 

Dieses passt sich perfekt mit strengen c99

gcc -std=c99 -pedantic -Wall -Wextra -Werror