一、问题形容
#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
是如何引入的并不理解,这是须要深刻开掘的中央。
欢送搜寻及关注:编程人