Как решить проблему конфликтующих типов в c? - PullRequest
2 голосов
/ 26 апреля 2019

Я получаю сообщение об ошибке для конфликтующих типов в функции getline.Я согласен с переменными и типами функций в обоих операторах объявления функций, поэтому я не знаю, в чем проблема.

#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);
}

Ответы [ 2 ]

4 голосов
/ 26 апреля 2019

Кажется, ваш компилятор настроен на использование стандарта POSIX, а в среде POSIX getline() уже прототипирован в stdio.h как

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

, что противоречит вашей декларации / определению.

Используйте другое имя функции (например: my_getline() или подобное).

2 голосов
/ 26 апреля 2019

Вы прекрасно компилируете код с помощью соответствующего компилятора.

Проблема в том, что ваш компилятор настроен как несоответствующий компилятор (он следует POSIX, но не C). Таким образом, вы получаете конфликт пространства имен между нестандартной функцией getline, которую POSIX помещает в stdio.h.

С такими компиляторами, как gcc, вы можете заблокировать появление нестандартных расширений в стандартных заголовках, компилируя с gcc -std=c11. По умолчанию gcc запускает -std=gnu11, что соответствует POSIX, но не стандарту C.

Если вы новичок в изучении C, всегда компилируйте с gcc -std=c11 -pedantic-errors -Wall -Wextra.

...