92 votes

Entrer « contradictoires types pour la fonction » en C, pourquoi ?

J’utilise le code ci-dessous :

La mise en œuvre de foo n’est pas important ici. Quand j’essaie de compiler ce qui précède, j’obtiens ces deux exceptions :

« erreur : types contradictoires pour « foo » » (à l’appel de printf) « erreur : précédente déclaration implicite de « foo » a été ici » (à la ligne du prototype)

Pourquoi ?

157voto

James McNellis Points 193607

Vous essayez d’appeler foo avant de vous déclarer. Vous devez ajouter un prototype de fonction avant votre ligne de printf :

Ou vous devez déplacer la définition de fonction au-dessus de la ligne de printf. Vous ne pouvez pas utiliser une fonction avant qu’elle est déclarée.

28voto

AndreyT Points 139512

Lorsque vous appelez un non déclarées fonction, C suppose qu'elle renvoie un int et tente de tirer les types de ses paramètres à partir des types des arguments réels (non, ce n'est pas supposer qu'il n'a pas de paramètres, comme quelqu'un l'a suggéré avant).

Dans votre exemple spécifique d'une telle implicitement dérivée de déclaration de l' do_something se présenterait comme suit

int do_something(char *, char *)

Cependant, plus tard dans le code, vous déclarez do_something comme

char *do_something(char *, const char *)

Comme vous pouvez le voir, ces déclarations sont différents les uns des autres. C'est ce que le compilateur n'aime pas.

6voto

Viliam Points 2219

Vous devez déclarer la fonction avant de l’utiliser. Si le nom de la fonction s’affiche avant sa déclaration, le compilateur C va suivre certaines règles et rend la déclaration elle-même. Si c’est faux, vous obtiendrez cette erreur.

Vous avez deux options : (1) définir il avant utilisation il, ou (2) utilisation avant déclaration sans la mise en œuvre. Par exemple :

Notez le point-virgule à la fin.

3voto

mrduclaw Points 1917

Lorsque vous ne donnez pas le prototype de la fonction avant de l'utiliser, C suppose qu'il prend un nombre quelconque de paramètres et renvoie un int. Ainsi, lorsque vous essayez d'abord d'utiliser faire_quelque_chose, c'est le type de la fonction, le compilateur est à la recherche pour. Cela devrait produire un avertissement à propos d'un "implicite de la déclaration de la fonction".

Donc dans votre cas, lorsque vous déclarez la fonction plus tard, C ne permet pas de surcharge de fonctions, de sorte qu'il devient pissy parce que vous avez déclaré deux fonctions prototypes différents mais avec le même nom.

Réponse courte: déclarer la fonction avant de l'utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X