9
votes

Pourquoi GCC signalera-t-il "la déclaration implicite de la fonction" ronde ""?

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);


0 commentaires

6 Réponses :


3
votes

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: xxx


1 commentaires

Je suis sur Ubuntu 9.10 (Karmic). Ici, #include charge /usr/include/math.h qui charge /usr/include/bits/mathcalls.h qui contient la déclaration.



0
votes

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.

Avez-vous regardé dans sur votre machine?

Avez-vous essayé avec des options telles que '-STC = C99'?


0 commentaires

17
votes

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) xxx

citation de manuel GCC

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.


7 commentaires

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 () (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



3
votes

Vous devez dire à GCC que vous voulez C99 et que vous souhaitez créer un lien dans la libm: xxx


0 commentaires

-2
votes

Vous devez créer un lien avec la bibliothèque de mathématiques. Donc, lorsque vous compilez, assurez-vous d'ajouter le drapeau -LM .


1 commentaires

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.



0
votes

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".

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.


1 commentaires

Le mode par défaut est -std = gnu89 :)