"implizite Deklaration der Funktion "fcloseall' ist ungültig in C99" beim kompilieren zu gnu99
Betrachten Sie den folgenden C-code:
#include <stdio.h>
#include <stdlib.h>
void fatal(const char* message){
/*
Prints a message and terminates the program.
Closes all open i/o streams before exiting.
*/
printf("%s\n", message);
fcloseall();
exit(EXIT_FAILURE);
}
Ich bin mit clang 2.8 kompilieren: clang -Wall -std=gnu99 -o <executable> <source.c>
Und erhalten: implicit declaration of function 'fcloseall' is invalid in C99
Das stimmt zwar, aber ich bin explizit kompilieren zu gnu99 [, die Sie unterstützen sollten, fcloseall()], und nicht zu c99.
Obwohl der code ausgeführt, ich weiß nicht, wie zu haben, der nicht aufgelösten Warnungen beim kompilieren.
Wie kann ich dieses Problem lösen?
Bearbeiten: korrigiert tipo.
Ich Schnitt und klebte Ihren code ein und bekam einen erwarteten link-Fehler über
Was passiert, wenn Sie erklären es selbst? I. e. setzen
Es gibt absolut keinen Grund zu nennen
Ok, das ist nützlich, Informationen -vielen Dank. Ich werde sich mein code entsprechend.
main
nicht definiert wird, aber keine implizite Deklaration Fehler. Sind Sie sicher, dass Sie Ihre Fehler aus der version von dem code, den du gezeigt hast?Was passiert, wenn Sie erklären es selbst? I. e. setzen
int fcloseall(void);
irgendwo.Es gibt absolut keinen Grund zu nennen
fcloseall
. Es ist eine nutzlose Nichtstandard-Funktion. exit
schon sicher schließt alle geöffneten Dateien, und wenn Ihr Programm endet mit _Exit
oder exec
stattdessen fflush(NULL)
wird bündig alle Dateien, die ist genauso gut und Normen-konform.Ok, das ist nützlich, Informationen -vielen Dank. Ich werde sich mein code entsprechend.
InformationsquelleAutor Emanuel Ey | 2011-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht-standard-Erweiterungen, wenn Sie verwendet die standard-Kopfzeilen, die Sie brauchen, um zu definieren, die passenden feature-test-makro. In diesem Fall
_GNU_SOURCE
funktionieren sollte.Dies ist unabhängig von der
-std=gnu99
die es ermöglicht, Sprache Erweiterungen, nicht-library Erweiterungen._GNU_SOURCE
in Ihrem code verwenden-D_GNU_SOURCE
statt!Können Sie erklären oder eine unterstützende Referenz? Danke.
Stimme überhaupt nicht zu. Wenn der code basiert auf Funktionen, die von einer bestimmten Norm, dass Vertrauen sollte klar gesagt werden, in den Quellcode.
Definition
_GNU_SOURCE
innerhalb des Codes gelten nur für umfasst nach der definition. Dies kann sehr leicht dazu führen, dass mehrere unterschiedliche Versionen der gleichen header in deinem code. Mit compiler flag, der dieses problem verhindern.Es sollte weiter angemerkt, dass es keine legitime Verwendung für
fcloseall
mehr, als es eine legitime Verwendung für eine hypothetischefreeall
Funktion. Freigeben von "allen" Ressourcen eines bestimmten Typs ist ein Programmier-Fehler; Sie sollten freigegeben werden individuell durch den code, der diese besitzt oder gar nicht.fflush(0)
wäre eine völlig sichere und portable Weg, um sicherzustellen, dass alle Daten geschrieben werden, ohne gegen diesen Grundsatz verstoßen, aber ein anschließender Aufruf vonexit
schon das richtige tut sowieso, also diese ganze Frage ist eine Frage der Cargo-Kult-Programmierung...InformationsquelleAutor CB Bailey
Hier in der
man
Seitefcloseall()
Haben Sie Makros definieren, _GNU_SOURCE ist Sie snippet, zusammen mit
stdio.h
header._GNU_SOURCE
ist ein feature-test-Makros, die verwendet werden, um erstellen Sie eine portable Anwendung.InformationsquelleAutor Sandeep_black