40

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

#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;
}

这是我尝试使用 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

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

4

7 回答 7

42

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

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

于 2012-01-06T19:09:25.400 回答
42

冲突函数getline()是 GNU/POSIX 扩展。

K&R 声明他们在他们的书(cf)中专门针对 ANSI C,这本书不提供此功能。

作者提供了 ANSI 标准 C 语言编程的完整指南。

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

例如,下面的编译就好了:

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

(除了他们抱怨隐式默认返回类型main()with -Wall。)

显然,在某些系统上,这些模式可能无法按此处介绍的方式工作(显然某些 Mac OS 版本无法正确禁用所有扩展)。我在我的机器上成功测试了这个:

$ 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.
于 2013-06-29T08:53:06.873 回答
10

这是因为它stdio.h有一个getline()功能。

因此,完成这项工作的一个简单方法是将您的函数重命名为my_getline()

两者getline()getdelim()最初都是GNU扩展。它们在POSIX.1-2008.

于 2012-01-06T19:10:56.043 回答
4

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

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

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

int main(int argc, char **argv)

或者:

int main(int argc, char *argv[])
于 2012-01-06T19:10:33.547 回答
2

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

于 2012-01-06T19:10:15.193 回答
2

getline现在是一个 POSIX 函数stdio.h

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

于 2012-01-06T19:11:03.227 回答
1

这已经是在“stdio.h”文件中定义的一个名为 getline 的函数。因此原型冲突!将您的函数重命名为“my_getline”或其他名称,一切都应该没问题!

于 2012-01-06T19:12:25.353 回答