la “déclaration implicite de la fonction "fcloseall' est pas valide en C99” lors de la compilation de gnu99
De considérer les éléments suivants du code C:
#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);
}
Je suis en utilisant clang 2,8 à compiler: clang -Wall -std=gnu99 -o <executable> <source.c>
Et obtenez: implicit declaration of function 'fcloseall' is invalid in C99
Qui est vrai, mais je suis explicitement la compilation de gnu99 [ce qui devrait soutenir fcloseall()], et de ne pas c99.
Bien que le code s'exécute, je n'aime pas avoir en suspens avertissements lors de la compilation.
Comment puis-je résoudre ce problème?
Modifier: correction de typo.
J'ai coupé et collé votre code et un lien prévu erreur sur
Qu'advient-il si vous déclarez vous-même? I. e. mettre
Il n'y a absolument aucune raison de l'appeler
Ok, c'est de l'information utile -merci. Je vais adapter mon code en conséquence.
main
pas défini, mais pas de la déclaration implicite de l'erreur. Êtes-vous sûr que votre erreur vient de la version du code que vous avez montré?Qu'advient-il si vous déclarez vous-même? I. e. mettre
int fcloseall(void);
quelque part.Il n'y a absolument aucune raison de l'appeler
fcloseall
. Il est inutile non standard de la fonction. exit
déjà se ferme en toute sécurité tous les fichiers, et si votre programme prendra fin avec _Exit
ou exec
au lieu de cela, fflush(NULL)
vider tous les fichiers qui est tout aussi bonnes et conformes aux normes.Ok, c'est de l'information utile -merci. Je vais adapter mon code en conséquence.
OriginalL'auteur Emanuel Ey | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Pour inclure les extensions non standard lorsque vous d'inclure des en-têtes standard, vous devez définir les macros de test de fonctionnalité. Dans ce cas
_GNU_SOURCE
devrait fonctionner.Ceci est indépendant de
-std=gnu99
qui permet des extensions de langage, pas de bibliothèque d'extensions._GNU_SOURCE
à l'intérieur de votre code, utilisez-D_GNU_SOURCE
à la place!Pouvez-vous expliquer ou de fournir un soutien de référence? Merci.
Fortement en désaccord. Si le code s'appuie sur les fonctionnalités d'un standard particulier, que le recours doit être clairement indiqué dans le code source.
La définition de
_GNU_SOURCE
à l'intérieur de votre code s'applique uniquement à l'inclut à la suite de la définition. Cela peut très facilement conduire à plusieurs versions différentes de la même en-tête, d'être inclus dans votre code. À l'aide du compilateur drapeau permet d'éviter ce problème.Il faut noter de plus qu'il n'y a aucune utilisation légitime de
fcloseall
plus qu'il y a une utilisation légitime pour un hypothétiquefreeall
fonction. La désallocation de "toutes" les ressources d'un type donné est une erreur de programmation; ils devraient être désalloué individuellement par le code qui les possède ou pas du tout.fflush(0)
serait parfaitement sûr et portable de façon à s'assurer que toutes les données sont écrites sans violer ce principe, mais l'appel suivant àexit
déjà fait la bonne chose, de toute façon, donc, toute cette question est une question de Culte du Cargo de la Programmation...OriginalL'auteur CB Bailey
Ici dans le
man
page defcloseall()
Vous devez définir des macros _GNU_SOURCE est vous extrait, avec
stdio.h
en-tête._GNU_SOURCE
est une fonctionnalité de macros de test qui est utilisé pour créer des application portable.OriginalL'auteur Sandeep_black