Here is a program I'm trying to run straight from section 1.9 of "The C Programming Language".
#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;
}
Here is the error I get when I try to compile the program using 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
Just to make sure it wasn't a problem with the print in the book, I referenced this set of answers to back of chapter exercises from the book (http://users.powernet.co.uk/eton/kandr2/krx1.html) and I get a similar error when I try to run exercises 18, 19, 20, 21, etc., from that link. It's really hard to learn when I can't run the programs to see how they output. This issue started when introducing character arrays and function calls in one program. I'd appreciate any advice on this issue.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With