关于c:error-conflicting-types-for-xxx-in-c

52次阅读

共计 1915 个字符,预计需要花费 5 分钟才能阅读完成。

一、问题形容

#include <stdio.h>

#define MAXLINE 1000

/* maximum input line length */
int getline(char lines[], int maxline);
void copy(char to[], char from[]);

int main(void)
{
    int len;  // current line length
    int max;  // maximum lenght seen so far
    char line[MAXLINE]; // current input line
    char longest[MAXLINE]; // longest line

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

    return i;
}


void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

运行以上代码的时候呈现谬误提醒:error: conflicting types for 'getline'; have 'int(char *, int)'。代码来源于《C Programming Language》。

二、问题剖析

这段代码来自于《C Programming Language》这本经典的书,按理说不应该有问题,要有问题的话往往可能是因为工夫长远,C 语言产生了变动。

依据提醒 conflicting types —— conflicting: are different and apposing,对于 getline() 函数,应该是它的 type 在某两个中央 (函数申明 & 函数定义) 不一样,可能是 函数的参数类型 不一样,也有可能是 函数的返回类型 不一样。

咱们先来看下函数申明:

int getline(char lines[], int maxline);

再来看下函数定义:

int getline(char s[], int lim)

奇怪,函数的参数类型和函数的返回类型都一样啊,为什么还会提醒谬误呢?既然这个两个中央没有问题,那么就剩下函数名了,这里应该有问题。那就换一个名字吧,比方改成 getaline

#include <stdio.h>

#define MAXLINE 1000

/* maximum input line length */
int getaline(char lines[], int maxline);
void copy(char to[], char from[]);

int main(void)
{
    int len;  // current line length
    int max;  // maximum lenght seen so far
    char line[MAXLINE]; // current input line
    char longest[MAXLINE]; // longest line

    max = 0;
    while ((len = getaline(line, MAXLINE)) > 0)
        if (len > max) {
          max = len;
          copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);

    return 0;

}

int getaline(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;
    }

    return i;
}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

这样一改,还真能够了。然而如同还是没有解释为什么 getline()这个函数名被占用了呢?依据 材料,getline()a GNU extension,因为本文着重于解说如何从提醒去剖析问题,所以对于 getline() 函数如何造成这种抵触的不开展解说。

三、解决办法

将函数名 getline批改成其它名字,比方改成 getaline

四、总结

这个问题之所以给我造成困扰,在于问题的起因体现得并不是那么间接——并不能间接从源代码看进去,同时也反映了我对 getline是如何引入的并不理解,这是须要深刻开掘的中央。

欢送搜寻及关注:编程人

正文完
 0