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

后端 未结 7 443
没有蜡笔的小新
没有蜡笔的小新 2020-12-04 17:09

Here is a program I\'m trying to run straight from section 1.9 of \"The C Programming Language\".

#include 
#define MAXLINE 1000

int getline(         


        
相关标签:
7条回答
  • /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[])
    
    0 讨论(0)
  • 2020-12-04 17:16

    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!

    0 讨论(0)
  • 2020-12-04 17:21

    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.

    0 讨论(0)
  • 2020-12-04 17:23

    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.

    0 讨论(0)
  • 2020-12-04 17:25

    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.
    
    0 讨论(0)
  • 2020-12-04 17:30

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

    0 讨论(0)
提交回复
热议问题