erreur: types en conflit pour ‘six’ avec gcc

Erreur de réception: types en conflit pour «six» lors de la tentative de compilation.

void main(){ const int k = 4; six(&k); } float * six(const int *x) { float *p = malloc(sizeof(float)); *p = (float)*x; return p; } 

Voici ce qui se passe.

Lorsque le compilateur ne rencontre pas de prototype pour une fonction avant un appel, il le déduit de l’appel lui-même et suppose que le type de retour est int. C’est ce que cela fait dans votre exemple.

Plus tard, il trouve la définition de la fonction et le type de retour est en réalité float, ce qui ne correspond pas au prototype déduit précédemment. D’où l’erreur de types en conflit (au lieu de, disons, prototype manquant).

Bien entendu, la solution consiste à fournir un prototype pour la fonction avant que l’appel ne soit effectué.

Vous n’avez pas déclaré six au compilateur avant de l’appeler, le compilateur a donc été contraint de deviner quelle est la signature de six (généralement, c’est quelque chose comme int func() ). Lorsqu’il a vu la déclaration réelle, il a généré une erreur car la déclaration de la fonction réelle ne correspondait pas à sa déclaration implicite.

Vous devez déclarer les fonctions avant de les utiliser. placer une déclaration comme

 float *six(const int *x); 

avant main .

Solution à votre problème

Ajoutez simplement la déclaration suivante avant main() :

float *six(const int *x);

Ou placez votre définition float *six(const int *x) avant la fonction main() .

Pourquoi le compilateur se plaint de conflicting types

Puisqu’il n’y a pas de déclaration de votre fonction six() avant la compilation de la fonction principale par le compilateur, le prototype sera déduit de la fonction callsite et supposera que le type de retour est int . Et quand il comstackra votre fonction six() , le compilateur trouvera deux fonctions portant le même nom mais un type de retour différent, de sorte qu’elle se plaint de l’erreur de conflicting types .

Merci au commentaire de Ziffusion.

pourquoi ajuster votre code de la manière ci-dessus

Vous devez déclarer / définir chacun de vos éléments avant de les utiliser en C.

Pour votre code actuel, vous devez déclarer votre type de fonction avant la fonction principale, afin que le compilateur sache ce que six() correspond à la compilation de la fonction main .

Pourquoi il devrait y avoir une déclaration avant utilisation en C

Pour les variables et autres types de données, C étant typé fort. Lorsque la variable est utilisée, elle doit d’abord être déclarée pour que le compilateur sache le type de la variable et puisse vérifier le type de données.

Pour les fonctions, étant donné que le compilateur C comstack la fonction de code par fonction et génère une instruction d’appel de fonction dans l’assembly, le compilateur doit donc connaître le paramètre de fonction et le type de données de la valeur renvoyée, afin de générer des instructions correctes pour le paramètre. en passant, et en retournant la valeur de restauration. Normalement, le compilateur comstackra la fonction dans un fichier de code source un par un, du début à la fin du fichier. Vous devez donc déclarer le type de fonction avant de l’utiliser.