Почему я получаю ошибку "конфликтующие типы для getline" при компиляции самого длинного примера строки в главе 1 K&R2?

вот программа, которую я пытаюсь запустить прямо из раздела 1.9 "язык программирования C".

#include <stdio.h>
#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
        max = len;
        copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
return 0;
}


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] = '';
    return i;
}


void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '')
        ++i;
}

вот ошибка, которую я получаю, когда пытаюсь скомпилировать программу с помощью Ubuntu 11.10:

cc     word.c   -o word
word.c:4:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
word.c:26:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
make: *** [word] Error 1

просто чтобы убедиться, что это не проблема с печатью в книге, я ссылался на этот набор ответов на заднюю часть главы упражнений из книги (http://users.powernet.co.uk/eton/kandr2/krx1.html) и я получаю аналогичную ошибку, когда пытаюсь выполнить упражнения 18, 19, 20, 21 и т. д. из этой ссылки. Очень трудно учиться, когда я не могу запустить программы, чтобы увидеть, как они выводятся. Эта проблема началась при введении массивов символов и вызовов функций в одной программе. Я бы признателен за любые советы по этому вопросу.

7 ответов


проблема в том, что getline() стандартная функция библиотеки. (определено в stdio.h) функция имеет то же имя и, таким образом, сталкиваясь с ним.

решение состоит в том, чтобы просто изменить имя.


конфликтующие функции getline() является расширением GNU / POSIX.

K&R заявляют, что они обращаются конкретно к ANSI C в своей книге (С. Ф.), который не обеспечивает эту функцию.

авторы представляют полное руководство по программированию языка ANSI standard C.

для того, чтобы установить gcc в "режим совместимости K&R", вы можете указать режимы ANSI или ISO для компиляции. Они предназначены для отключения расширения, например, функция getline(). Это может в конечном итоге устранить необходимость редактирования других примеров, предоставленных K&R.

например, следующая компиляция просто отлично:

$ gcc test.c -ansi
$ gcc test.c -std=c89

(кроме того, что они жалуются на неявный параметр типа main() С -Wall.)

на некоторых системах эти режимы могут работать не так, как представлено здесь (apparantly некоторые версии Mac OS не могут правильно отключить все расширения). Я успешно протестировал это на своей машине:

$ gcc --version
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

это так stdio.h есть


/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here

это должно дать вам подсказку. Попробуйте переименовать getline() функция в коде для чего-то другого.

кроме того, объявив main() Это старый стиль. Функция без объявленного типа возврата и аргументов по умолчанию принимает неопределенное количество аргументов и возвращает int. Это почти относится к main(): он возвращает int, но имеет два аргумента. Вам лучше объявить это так:

int main(int argc, char **argv)

или:

int main(int argc, char *argv[])

getline теперь функция POSIX объявлена в stdio.h

переименовать вы getline функция на другое имя, и она будет компилироваться.


вам нужно изменить имя getline, потому что оно уже существует.


Это уже функция, называемая getline, определенная в " stdio.H-файл". Таким образом, конфликт в прототипах! Переименуйте свою функцию в "my_getline" или другое имя, и все будет в порядке!