为什么执行此程序时会抛出“冲突类型”错误?
在K&R第1.9章中,我一直在试验下面提供的程序。 特别是,如果我删除某些function减速会发生什么。
所以,我删除了第4行。 int getline(char line [],int maxline
据我所知,该程序完全符合并正常运行。
当我删除第5行。 void copy(char to [],char from []);
该程序引发以下错误:
yay.c:37:6:警告:’copy’void copy(char to [],char from [])的冲突类型
yay.c:15:9:注意:先前隐含的’复制’声明是复制(最长,行);
#include #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 = getfatline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) printf("%s", longest); return 0; } int getfatline(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; }
谁有人向我解释这个?
根据最新的C标准C11
,每个函数必须(至少)在使用之前声明。 通过这种方式,编译器将具有函数签名的知识。
在代码中,在调用函数时,如果声明(至少)对编译器不可见( 由于某些遗留原因 ),编译器( 以前 )会假设
- 该函数返回一个
int
- 接受任意数量的参数。
稍后,当您将函数定义为具有int
以外的返回类型时,它将创建冲突。
这就是为什么,
- 删除
getline()
的前向声明不会产生错误。 - 删除
copy()
的前向声明会产生错误,返回类型不匹配。
沿着同一行,不再需要支持main()
,因为隐式int
也已被删除。 你应该写int main(void)
,至少是标准的符合。
要添加函数,您需要为其提供原型。 多数民众赞成这是什么
void copy(char to[], char from[]);
但是如果你不提供原型,那么函数的返回类型默认为int
。
这就是它为函数getfatline()
工作的原因,因为它在后面的代码中使用它的返回类型是int
,这与删除原型时默认采用的相同。
但是当你删除函数copy
的原型时,返回类型默认设置为int
,但是你的函数定义的返回类型为void
,即发生冲突的地方,并且它会抛出错误。
Getline实际上是在stdio.h
头文件中定义的
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
因此删除自己的getline实现不会引发错误。 相反,删除你的其他函数会抛出一个错误,因为stdio.h中不存在这样的函数,但是它是用户定义的。 顺便说一下,在这种情况下,您可以通过从程序中删除函数本身来简单地解决您遇到的问题。