繁体   English   中英

为什么我会收到此错误:getline 的类型冲突

[英]Why do I get this error: Conflicting types for getline

有人可以看看这个并告诉我出了什么问题。 我有 3 个错误:

  1. error: Conflicting types for getline
  2. error: too few arguments to function call, expected 3 have 2
  3. error: conflicting types for getline

我确定我忽略了一些简单的事情,但我找不到我的错误。 谢谢,代码如下:

#include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline); /* conflicting types for getline */
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) /* too few arguments to call, expected 3 have 2 */
        if (len > max) {
            max = len;          
            copy(longest, line);
        }   
    
    if (max > 0)
        //printf("longest line = %d characters\n -->", max);
        printf("%s", longest);

    return 0;
}

int getline(char s[], int lim) { /*conflicting types for getline*/

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

简单的答案:不要调用你的函数getline 这个名字被取了。

(我知道,这是 K&R 中的一个例子。所以你应该能够使用它,对吗?不幸的是,不。我也烦。)

稍微长一点的答案:现在有一个半标准的getline函数,你的函数与之冲突。 如果您尝试命名您自己的函数之一printf ,您会遇到相同类型的错误。 可能有一种说法,“我不想使用标准的getline函数,我想使用我自己的”,但在这种情况下,它可能不值得。

(就个人而言:我已经用 C 编程了大约 35 年,其中大约 34.9 年我一直在使用自己的getline函数,自从我在 K&R 中读到它。但在过去的一年或所以我不得不重写我所有的程序,调用我自己的函数fgetline而不是getline来解决这个问题。)

有相同的 GNU 函数getline ,它不是 C 标准的一部分。 据推测,您正在编译时没有指定-std (特定的 C 标准),这使得从<stdio.h>公开此函数的 GNU 声明。

您可以使用-std=c99-std=c11进行编译,例如:

gcc -Wall -Wextra -std=c11 gl.c

或将您的函数重命名为类似my_getline()以避免这种冲突。

此外, main()的签名必须是标准签名之一。 由于您不使用命令行参数,因此可以使用:

int main(void) { .. }

请参阅: main() 在 C 和 C++ 中应该返回什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM