K & R 2e édition, exemple 1.9 Tableaux de caractères

J’ai une question concernant la fonction getline () et la définition du paramètre dans le code suivant. Le code provient directement du chapitre 1.9 de K & R: “Tableaux de caractères”. Je l’ai reproduit ici textuellement. Le problème est que lorsque je comstack le programme tel quel, je reçois trois erreurs (que j’ai reproduites à la fin). Lorsque je modifie la fonction et que la définition du paramètre de fonction est get_line () (avec un trait de soulignement au lieu de simplement getline) aux trois emplacements où j’obtiens les erreurs, les erreurs s’arrêtent et le programme s’exécute comme prévu.

Ma question est:

Qu’est-ce qui a changé en C, de sorte que getline () n’est pas valide, mais que get_line () est un nom valide pour une définition de fonction?

#include  #define MAXLINE 1000 // maximum input line size int getline(char line[], int maxline); void copy(char to[], char from[]); /* print longest input line */ int main() { int len; //current line lenght int max; //maximum length seen so far char line[MAXLINE]; //current input line char longest[MAXLINE];//longest line saved here max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) //there was a line printf("%s", longest); return 0; } /* getline: read a line into s, return length */ int getline(char s[], int lim) { int c, i; for (i = 0; i<lim-1 && (c=getchar()) != EOF && c !='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[],char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') { ++i; } } 

Les erreurs que je reçois sont:

  • ./section 1.9.1.c: 4: 5: erreur: types en conflit pour ‘getline’; int getline(int line[], int maxline);

  • ./section 1.9.1.c: 17: 40: erreur: trop peu d’arguments pour appeler une fonction, attendu 3, ont 2 tant while ((len = getline(line, MAXLINE)) > 0); et

  • ./section 1.9.1.c: 30: 5: erreur: types en conflit pour ‘getline’ int getline(int s[], int lim)

La bibliothèque stdio dissortingbuée avec glibc déclare une fonction également appelée getline avec une signature différente de la vôtre. Comme vous ne pouvez pas déclarer deux fonctions avec le même nom, le compilateur génère une erreur. La déclaration en conflit de getline trouvée dans stdio.h est:

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

La fonction getline était à l’origine une extension de la glibc et a ensuite été incluse dans POSIX.1-2008. Ce n’est pas une fonction C standard.

Si vous utilisez gcc vous pouvez obtenir un comportement conforme aux normes en utilisant le commutateur de ligne de commande -std . Entre autres choses, cela cache les déclarations de fonctions non standard. Essayez par exemple:

 gcc -Wall -pedantic -std=c11 "section 1.9.1.c" -o "section 1.9.1" 

stdio.h déjà une déclaration de getline() ,

Vous ne devez pas utiliser le même nom pour définir votre fonction getline .

Si vous voulez déclarer et définir la même fonction, vous devez utiliser un autre nom. comme get_line()

Vous obtenez un conflit entre votre nouvelle fonction déclarée et la fonction déclarée dans stdio.h.