GCC Avertissement: déclaration implicite de la fonction 'met' est pas valide en C99
Je commence Zed Shaw Apprendre C La Dure. J'ai téléchargé XCode et les Outils de Ligne de Commande. Mais quand je compile le tout premier programme:
int main(int argc, char *argv[]) {
puts("Hello world.");
return 0;
}
Je reçois cet avertissement:
ex1.c:2:1: attention: la déclaration implicite de la fonction 'met' est non valide
en C99
[-Wimplicit-fonction-déclaration]
Le programme ne compiler et exécuter correctement.
Je suis sur OSX 10.8.3. En entrant 'gcc -v'
donne:
À l'aide intégrée dans les specs. Cible: i686-apple-darwin11 Configuré avec:
/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configurer
--disable-vérification de l'option --enable-werror --prefix=/Applications/Xcode.app/Contents/Développeur/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --programme de transformation-nom=/^[cg][^.-]*$/s/$/-4.2/--with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Développeur/usr/local
--program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-inclure-dir=/usr/include/c++/4.2.1 modèle de Thread: posix version de gcc 4.2.1 (Basé sur Apple Inc. construire 5658) (LLVM construire 2336.11.00)
S'il vous plaît aider.
- L'utilisation de
int main(int argc, char *argv[])
lorsque les arguments sont inutilisés est légèrement stupide; il devrait êtreint main(void)
ou mêmeint main()
à la place. Cependant, c'est un débat pour un autre jour, probablement. Je remarque que GCC 5.x utilise C11 (-std=gnu11
) comme valeur par défaut mode de compilation.clang
(déguisé engcc
) utilise du C99. Les deux C99 et C11 besoin de toutes les fonctions (saufmain()
) à être déclarées avant leur utilisation.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'inclure stdio.h, c'est à dire
au début pour importer la définition de la fonction.
Ce "livre" devrait être renommé Apprennent À Haïr C En Suivant dénué de Sens, des Exemples Qui Sont Manifestement Faux.
Le bon code dans moderne C serait simple et facile
Alors que l'original exemple
aurait été tout simplement mauvais en 1989, dans 1999 (qui est de 18 ans avant la rédaction de cette réponse, et presque autant d'années avant le "livre" a été écrit) la norme a été révisée. Dans le C99 la révision, ce genre de implicite de la déclaration de la fonction a été rendue illégale - et naturellement, il demeure illégal dans la révision en cours de la norme (C11). Ainsi, à l'aide de
puts
sans#include
ing pertinentes de l'en-tête, c'est à dire ajoutant#include <stdio.h>
(ou la déclaration de laputs
fonction avecint puts(const char*);
) est un l'erreur de contrainte.Une contrainte d'erreur est une erreur que doit provoquer la sortie du compilateur un diagnostic de message. En outre, un tel programme est considéré comme un invalide programme. Cependant, l', quelque chose d'étrange à propos de la norme C est qu'il permet un compilateur C pour aussi compiler avec succès une défaillance du programme, si un compilateur peut ainsi rejeter. Par conséquent, un tel exemple n'est guère un bon point de départ dans un livre qui est censé enseigner C pour les débutants.