C K&;R错误:方法定义冲突

C K&;R错误:方法定义冲突,c,stdio,kernighan-and-ritchie,C,Stdio,Kernighan And Ritchie,我正在通过K&R(第二版)学习C,因为我一直在努力学习低级语言,以帮助我编程,也因为我想了解C。这本书非常棒;但是,他们在第29页(第1.9节字符数组)上提供的程序无法编译。这是密码 #include <stdio.h> #define MAXLINE 1000 /* maximum input line size */ int getline(char line[], int maxline); void copy(char to[], char from[]); /*

我正在通过K&R(第二版)学习C,因为我一直在努力学习低级语言,以帮助我编程,也因为我想了解C。这本书非常棒;但是,他们在第29页(第1.9节字符数组)上提供的程序无法编译。这是密码

#include <stdio.h>
#define MAXLINE 1000    /* maximum input line size */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print longest input line */
main()
{
    int len;            /* current line length */
    int max;            /* maximum length seen so far */
    char line[MAXLINE];     /* current input line */
    char longest[MAXLINE];  /* longest line saved here */

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)    /* there was a line */
        printf("%s", longest);
    return 0;
}

/* getline:  read a line int s, return length */
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;
}

/* copy:  copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}
#包括
#定义MAXLINE 1000/*最大输入行大小*/
int getline(字符行[],int maxline);
无效副本(字符到[],字符从[]);
/*打印最长输入行*/
main()
{
int len;/*当前线路长度*/
int max;/*到目前为止看到的最大长度*/
字符行[最大行];/*当前输入行*/
字符最长[MAXLINE];/*保存在此处的最长行*/
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(max>0)/*有一条线*/
printf(“%s”,最长);
返回0;
}
/*getline:读取一行int s,返回长度*/
int getline(字符s[],int lim)
{
int c,i;

对于(i=0;i这种方法通过不包含有问题的头来避免您的问题。相反,它将本地复制实现中所需的所有声明。
这是一个非常糟糕的想法,因为这些函数的声明可能会在您不知道的情况下更改,在这种情况下,您的代码将传递或接收错误的输入

#define MAXLINE 1000    /* maximum input line size */

int getline(char line[], int maxline);
void copy(char to[], char from[]);
int printf(const char *format, ...);
int getchar(void);

/* print longest input line */
int main()
{
    int len;            /* current line length */
    int max;            /* maximum length seen so far */
    char line[MAXLINE];     /* current input line */
    char longest[MAXLINE];  /* longest line saved here */

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0)    /* there was a line */
        printf("%s", longest);
    return 0;
}

/* getline:  read a line int s, return length */
int getline(char s[], int lim)
{
    int c, i;

    for (i = 0; i<lim-1 && (c=getchar())!=-1 && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

/* copy:  copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}
#定义MAXLINE 1000/*最大输入行大小*/
int getline(字符行[],int maxline);
无效副本(字符到[],字符从[]);
int printf(常量字符*格式,…);
int getchar(void);
/*打印最长输入行*/
int main()
{
int len;/*当前线路长度*/
int max;/*到目前为止看到的最大长度*/
字符行[最大行];/*当前输入行*/
字符最长[MAXLINE];/*保存在此处的最长行*/
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(max>0)/*有一条线*/
printf(“%s”,最长);
返回0;
}
/*getline:读取一行int s,返回长度*/
int getline(字符s[],int lim)
{
int c,i;

对于@Olaf评论的(i=0;i,
getline()
是标准POSIX

K&R第二版是ansi 89标准

只需在ansi模式下编译,以防止与POSIX库发生冲突:

gcc -ansi source.c

编辑:

OP想知道他是否可以避免重命名
getline
。我知道。我问我是否可以保留
getline
的定义,并以某种方式覆盖
stdio.h
的定义。不要自己声明标准库的函数!它们可能实际上是宏,具有特定于实现的属性,等等。使用standard headers.OP应该重命名她的函数。@Olaf,这是一个具体的例子,也是获得OP想要的东西的唯一可能的方法,不是所有的东西都是黑的或白的。它被清楚地提到了there@EliSadoff这是否回答了您的问题Eli?对于您在
中声明的参考。对于您的问题,除了重命名之外,没有其他解决方案在函数中,不能有两个同名的符号和两个不同的声明。可以将操作系统更改为非posix版本,也可以重命名函数。其中一个最快。1)C不支持方法,只支持函数2)K&R教授的是一种过时的、不符合标准的C语言版本。请使用最近的一本书。@Olaf方法和函数之间真的有区别吗?我听说它们是可以互换的。@GauravSehgal:1)
getline
是POSIX,而不是C2)K&R只是过时了。你的工具链是什么,代码是在(x86 gcc)上编译的,测试了从4.8到6.1gcc:4.2.1和LLVM:7.3.0的多个gcc版本。我在我的计算机上尝试了
gcc-4.8
gcc-6
两种版本,但它仍然无法编译。尝试更新的编译器4.2.1是从2008年开始的,我不知道该版本上的正确标志,可能需要其他东西来显式禁用posix,这是我所能做到的最早的在godbot is 4.4.7上进行测试这是我所能帮助的,您的工具链可能有问题。至少在linux x64上,它对我来说还可以。