为什么执行此程序时会抛出“冲突类型”错误?

在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中不存在这样的函数,但是它是用户定义的。 顺便说一下,在这种情况下,您可以通过从程序中删除函数本身来简单地解决您遇到的问题。