Why do I get a “conflicting types for getline” error when compiling the longest line example in chapter 1 of K&R2?

可紊 提交于 2019-11-27 18:08:48

The problem is that getline() is a standard library function. (defined in stdio.h) Your function has the same name and is thus clashing with it.

The solution is to simply change the name.

moooeeeep

The conflicting function getline() is a GNU/POSIX extension.

K&R state that they address specifically ANSI C in their book (c.f.), which does not provide this function.

The authors present the complete guide to ANSI standard C language programming.

In order set gcc into "K&R compatibility mode" you can specify the ANSI or ISO modes for compilation. These are intended to disable extensions, e.g., the function getline(). This could eventually eliminate the need to edit other examples provided by K&R as well.

For example, the following compile just fine:

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

(Except that they complain about the implicit default return type of main() with -Wall.)

Apparently on some systems, these modes may not work as presented here (apparently some version(s) of Mac OS fail to correctly disable all extensions). I tested this successfully on my machine:

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

This is because the stdio.h have a getline() function.

So a simple thing to make this work would be to rename your function to my_getline()

Both getline() and getdelim() were originally GNU extensions. They were standardized in POSIX.1-2008.

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

That should give you a hint. Try and rename the getline() function in the code to something else.

Also, declaring main() this way is old style. A function with no declared return type and arguments, by defaults, accepts an unspecified number of arguments and returns an int. This is nearly the case for main(): it does return an int, but has two arguments. You had better declare it as:

int main(int argc, char **argv)

or:

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

getline is now a POSIX function declared in stdio.h

Rename you getline function to another name and it will compile.

BlackBear

You have to change getline's name because it already exists.

The is already a function called getline defined in the "stdio.h" file. Thus a conflict in prototypes! Rename your function to "my_getline" or some other name and all should be fine!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!