2
votes

Comment résoudre une erreur de types en conflit dans C?

J'obtiens une erreur pour les types en conflit dans la fonction getline. Je suis cohérent dans les types de variable et de fonction dans les deux déclarations de déclaration de fonction, donc je ne sais pas quel est le problème.

#include <stdio.h>

int getline(char line[]);

int main()
{
   char line[100];
   int len;
   while ((len = getline(line)) > 0)
       printf("%d\n", len);
}

int getline(char line[])
{
   int i, c;
   for (i = 0; (c = getchar())!=EOF && c!='\n'; ++i)
        line[i] = c;
   if (c == '\n'){
        line[i] = c;
        ++i;
   }
   line[i] = '\0';
   return(i);
}


5 commentaires

getline () est déjà une fonction de bibliothèque standard. pourquoi devez-vous utiliser le même nom?


Comment résoudre une erreur de types en conflit dans c? Changer le nom du type.


Le compilateur vous a-t-il indiqué où la fonction a été initialement déclarée avec différents types? Si ce n'était pas votre propre déclaration, c'est un bon indice que vous réutilisez les identificateurs existants et que vous devriez changer le nom.


@SouravGhosh getline est plutôt une fonction de bibliothèque non standard.


@Lundin Oui, j'ai ajouté cela à ma réponse.


3 Réponses :


4
votes

Il semble que votre compilateur soit configuré pour utiliser le standard POSIX, et dans l'environnement POSIX, getline () est déjà prototypé dans stdio.h comme

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

, ce qui entre en conflit avec votre déclaration / définition.

Utilisez un nom de fonction différent (ex: my_getline () ou similaire).


1 commentaires

Je n'avais aucune idée que "getline" était déjà une fonction dans POSIX. J'ai changé le nom et ça a tout arrangé. Merci beaucoup!



3
votes

Votre code se compile très bien avec un compilateur conforme.

Le problème est que votre compilateur est défini comme un compilateur non conforme (il suit POSIX mais pas C). Vous obtenez donc une collision d'espace de noms entre la fonction non standard getline que POSIX place dans stdio.h.

Avec des compilateurs comme gcc, vous pouvez empêcher les extensions non standard d'apparaître dans les en-têtes standard, en compilant avec gcc -std = c11 . Par défaut, gcc exécute cependant -std = gnu11 , qui suit POSIX mais pas le standard C.

Si vous êtes un débutant en apprentissage du C, compilez toujours avec gcc -std = c11 -pedantic-errors -Wall -Wextra .


1 commentaires

Je vais ajouter ces options à partir de maintenant, car je suis nouveau sur C! Merci pour l'explication détaillée!



0
votes

Vous pouvez changer le nom de la fonction getline en fetchline, et tout fonctionnerait comme prévu. Félicitations à Lundin pour l'explication approfondie.


0 commentaires