写点什么

error: conflicting types for xxx in c

作者:codists
  • 2022 年 5 月 28 日
  • 本文字数:1503 字

    阅读完需:约 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是如何引入的并不了解,这是需要深入挖掘的地方。


欢迎搜索及关注:编程人

发布于: 刚刚阅读数: 3
用户头像

codists

关注

公众号:编程人 2021.01.14 加入

Life is short, You need Python

评论

发布
暂无评论
error: conflicting types for xxx in c_c_codists_InfoQ写作社区