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); }
3 Réponses :
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).
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!
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
.
Je vais ajouter ces options à partir de maintenant, car je suis nouveau sur C! Merci pour l'explication détaillée!
Vous pouvez changer le nom de la fonction getline en fetchline, et tout fonctionnerait comme prévu. Félicitations à Lundin pour l'explication approfondie.
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.