为什么在编译K&R2第1章中最长的行示例时,出现“getlinetypes冲突”错误?

这是一个我试图从“C语言编程”第1.9节直接运行的程序。

#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] = '\0'; return i; } void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++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等时,我得到一个类似的错误。 当我无法运行这些程序来查看它们的输出时,真的很难学。 在一个程序中引入字符数组和函数调用时就开始了这个问题。 我很感激在这个问题上的任何build议。

Solutions Collecting From Web of "为什么在编译K&R2第1章中最长的行示例时,出现“getlinetypes冲突”错误?"

问题是getline()是一个标准的库函数。 (在stdio.h定义)您的函数具有相同的名称,因此与它冲突。

解决办法是简单地改变名字。

冲突函数getline()是一个GNU / POSIX扩展。

K&R声明他们在他们的书(cf)中特别提到了ANSI C,它没有提供这个功能。

作者介绍了ANSI标准C语言编程的完整指南。

为了将gcc设置为“K&R兼容模式”,您可以指定ANSI或ISO模式进行编译。 这些打算禁用扩展,例如getline()函数。 这最终可以消除编辑由K&R提供的其他例子的需要。

例如,下面的编译就好了:

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

(除了他们抱怨带-Wallmain()的隐式默认返回类型main()

在某些系统上可能会出现某些系统,但这些模式可能无法正常工作( 显然,某些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有一个getline()函数。

所以做这个工作的一个简单的事情就是将你的函数重命名为my_getline()

getline()getdelim()都是GNU扩展。 他们在POSIX.1-2008标准化。

/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现在是一个在stdio.h声明的POSIX函数

将你的getline函数重命名为另一个名称,它将被编译。

你必须改变getline的名字,因为它已经存在。

这已经是一个名为“stdio.h”文件中定义的getline函数。 因此在原型冲突! 将你的函数重命名为“my_getline”或其他名字,一切都应该没问题!