Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我会得到一个“;getline“的冲突类型”;编译K&;的第1章中的最长行示例时出错;R2?_C_Linux_Kernighan And Ritchie - Fatal编程技术网

C 为什么我会得到一个“;getline“的冲突类型”;编译K&;的第1章中的最长行示例时出错;R2?

C 为什么我会得到一个“;getline“的冲突类型”;编译K&;的第1章中的最长行示例时出错;R2?,c,linux,kernighan-and-ritchie,C,Linux,Kernighan And Ritchie,这是一个我试图直接从“C编程语言”的第1.9节运行的程序 为了确保书中的印刷没有问题,我引用了书中章节练习后面的这组答案(http://users.powernet.co.uk/eton/kandr2/krx1.html)当我尝试运行练习18、19、20、21等时,从该链接得到一个类似的错误。当我无法运行程序来查看它们的输出时,学习起来真的很难。这个问题始于在一个程序中引入字符数组和函数调用。如果您能就此问题提供任何建议,我将不胜感激。问题在于getline()是一个标准的库函数。(在stdio

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


为了确保书中的印刷没有问题,我引用了书中章节练习后面的这组答案(http://users.powernet.co.uk/eton/kandr2/krx1.html)当我尝试运行练习18、19、20、21等时,从该链接得到一个类似的错误。当我无法运行程序来查看它们的输出时,学习起来真的很难。这个问题始于在一个程序中引入字符数组和函数调用。如果您能就此问题提供任何建议,我将不胜感激。

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


解决方案是简单地更改名称。

您必须更改getline的名称,因为它已经存在。

/usr/include/stdio.h:671:20:注意:“getline”之前的声明就在这里。

这应该给你一个提示。尝试将代码中的
getline()
函数重命名为其他函数

而且,这种方式声明
main()
是旧式的。默认情况下,没有声明返回类型和参数的函数接受未指定数量的参数并返回int。这与
main()
的情况几乎相同:它确实返回int,但有两个参数。您最好将其声明为:

int main(int argc, char **argv)
或:


这是因为
stdio.h
有一个
getline()
函数

因此,一个简单的方法就是将函数重命名为
my\u getline()


getline()
getdelim()
最初都是
GNU
扩展。它们是在POSIX.1-2008中标准化的
getline
现在是在
stdio.h中声明的POSIX函数


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

该函数已经是在“stdio.h”文件中定义的名为getline的函数。因此,原型之间存在冲突! 将您的函数重命名为“my_getline”或其他名称,一切正常

冲突函数是GNU/POSIX扩展

K&R声明他们在书中专门提到了ANSI C,但书中没有提供此功能

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

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

例如,下面的编译很好:

$ gcc test.c -ansi
$ gcc test.c -std=c89
(除了他们抱怨
main()
-Wall
的隐式默认返回类型)

显然,在某些系统上,这些模式可能无法按此处所示工作()。我在我的机器上成功地测试了这一点:

$ 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.

仅在C99中不推荐使用此选项。在K&R(第2版)的最新版本中,
main
函数仍然使用旧式函数定义。真的吗?我认为它已经被弃用了很久,因为第一个ANSI C规范…我有同样的问题在问题中描述。我查阅了一些C引用,查看
getline()
是否在标准库中定义,但没有找到它,这让我更加困惑。我在这里找到的答案很有帮助,这些答案指定在POSIX标准C库中定义了
getline()
。简单地说“它已经存在”是令人困惑的,可能是不正确的。@IsaacKleinman虽然我承认我的答案不够精确,但仍然是正确的:引用公认的答案“问题是getline()是一个标准的库函数。(在stdio.h中定义)“一个小小的好奇:FreeBSD提供了getline()但是不在任何标题中声明它,恰恰是为了避免这种名称冲突()@loreb这很有意思,尽管必须定义一些只用于
getline()
的东西感觉很恶心。这是对这个问题的正确答案。不是如何修复它,而是如果这本书是由专家撰写的,为什么会失败呢?“因为这本书是在getline还没有标准化的时候写的。”啊,谢谢。@mikiemorales这本书是按照另一个标准写的。请看我的答案:getline()不是一个标准的库函数,它是一个扩展,正如@moooeeep更深入地说的,这里也是@Dietrich Epp。因此,如果您现在正在编码,您不应该使用
getline()
,但是如果您依赖的库已经使用了它自己实现的
getline()
函数,该怎么办?我认为,从广义上讲,@moooeeep的答案更合适。我浪费了3瓶啤酒和额外的20分钟,最后考虑用谷歌搜索它。我尝试了
gcc test.c-ansi
。好像不起作用了。@Jack你试过什么OS/--版本?我用的是macOS Sierra版本10.12.5。在此操作系统中是否有任何对gcc test.c-ansi的替代?也许您可以尝试以下方法:除此之外,您可能需要重命名函数:(
int main(int argc, char *argv[])
$ gcc test.c -ansi
$ gcc test.c -std=c89
$ 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.