Почему я получаю ошибку "конфликтующие типы для 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.
/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, определенная в " stdio.H-файл". Таким образом, конфликт в прототипах! Переименуйте свою функцию в "my_getline" или другое имя, и все будет в порядке!