J'ai le code C suivant:
$ gcc -E round_test.c | grep round # 1 "round_test.c" # 1 "round_test.c" # 2 "round_test.c" 2 double whatever = round(mydouble);
6 Réponses :
Quelque chose doit avoir tort avec votre installation de GCC, vos en-têtes système ou vos options de compilation.
essayez de compiler -e. Cela vous montrera ce que la production de préprocesseur - y compris les en-têtes est incluse et qu'est-ce qui y est. Sur mon système Ubuntu Linux, il s'agit d'environ 1000 lignes de sortie, y compris ceci: p>
Je suis sur Ubuntu 9.10 (Karmic). Ici, #include
Le code que vous tapez compile proprement sur MacOS X 10.5.8 avec GCC 4.0.1. Si elle a poussé avec des options '-wall -wextra', il se plaint de paramètres non utilisés argc et argv - non matériels. P>
Avez-vous regardé dans Avez-vous essayé avec des options telles que '-STC = C99'? P>
Je vois que vous utilisez GCC.
Par défaut, GCC utilise une norme similaire à c89. Vous voudrez peut-être "forcer"-dessus pour utiliser la norme C99 (les parties qu'il respecte) p> citation de manuel GCC p> Par défaut, GCC fournit certains
extensions au langage C sur qui sur
rares occasions en conflit avec le c
la norme. Voir les extensions au c
Famille de langue. Utilisation du -std
Les options énumérées ci-dessus désactiveront
ces extensions où ils se conflit
avec la version standard C sélectionnée.
Vous pouvez également sélectionner une étendue
version du langage C explicitement
avec -std = gnu89 (pour C89 avec GNU
Extensions) ou -Std = gnu99 (pour C99
avec des extensions GNU). La valeur par défaut, si
Aucune option de dialecte linguistique c
donné, est -std = gnu89; Cela changera
à -std = gnu99 dans une nouvelle version future
lorsque le support C99 est complet. Certains
caractéristiques qui font partie du C99
la norme sont acceptées comme des extensions dans
Mode C89. P>
blockQuote> p>
Merci, -std = C99 semblait le résoudre. Je n'avais pas réalisé rond () était un ajout C99 (et bien sûr que toutes mes références sont C99 et négligent de la mentionner)
(Look surpris) est rond () vraiment un addition C99?
Droite, C89 n'a pas décrit la fonction rond () code> (de compilateurs de cours pourraient lui fournir une prolongation).
On dirait que - de l'Ubuntu 8.04 Manpage - Rond (), Roundf (), Roundl (): _XOPEN_SOURCE> = 600 || _Isoc99_source; ou cc -std = c99
Également besoin -LM pour relier la libm pour obtenir la fonction réelle.
@Tim: Si vous souhaitez une version textuelle de la norme C89 Look @ flash-gordon .me.uk / ansi.c.txt
Eu un problème similaire (3 ans plus tard ...) et c'était la solution. Je n'aurais pas deviné que la solution était de forcer C99. Bon conseil. +1
Vous devez dire à GCC que vous voulez C99 et que vous souhaitez créer un lien dans la libm:
Vous devez créer un lien avec la bibliothèque de mathématiques. Donc, lorsque vous compilez, assurez-vous d'ajouter le drapeau -LM code>. p>
Merci pour l'entrée, mais c'est un problème de compilation, pas un problème de liaison. J'ai réalisé que j'ai laissé mon commandement de compilateur (mon mauvais), mais je compilais avec GCC -C.
C99 était la réponse, mais l'histoire complète est un peu plus compliquée. La raison pour laquelle je jouais, c'est que j'essayais de compiler une bibliothèque écrite pour Windows, qui avait sa propre définition "optimisée" du tour (). J'ai eu une erreur de liaison qui me dise que la définition en conflit avec l'intégré, donc j'ai supprimé la définition (et la déclaration). Une fois que j'avais fait que j'ai commencé à obtenir l'erreur "Erreur de déclaration implicite". P>
Il semble que le mode de compilation par défaut (sans le drapeau -st = C99) ne soit ni conforme C89 ni C99: s'il était conforme au C89, vous devriez être en mesure de fournir une définition personnalisée du tour () sans conflit, et si C'était conforme au C99 la déclaration devrait être en maths.h. p>
Le mode par défaut est -std = gnu89 code> :)