以下是 src1.c 的内容:
#include <stdio.h>
extern int w;
//int go(char); // no need to declare here. WHY????
main(){
char a='f';
go(a);
printf("%d\n", w);
}
这是 src2.c 的内容:
#include <stdio.h>
int w = 99;
int go(char t){
printf("%c\n%d\n",t,sizeof(t));
}
为什么Linux 编译后不需要go
在文件中声明函数?src1.c
cc src1.c src2.c;
编译器是否将文件中的go
函数定义放在src2.c
主函数代码之上,这样就不需要声明了?
在我这样做:
#include <stdio.h>
int go(char); // need to declare here, because if not, arguments of go will be promoted to intS and they would conflict with char parameters defined in go. Error is droped!
main(){
char a='f';
go(a);
}
int go(char t){
printf("%c\n%d\n",t,sizeof(t));
}
所以每个人都说,在没有原型的情况下可以传递任何数量和类型的参数是错误的。在这种情况下,它们被提升为int
s,但必须与定义中指定的一致。
我做了一些测试,发现即使编译没有错误,它也不能正常工作。
src1:
#include <stdio.h>
int go(int t){
printf("%d\n%d\n",t,sizeof(t));
}
sr2.c:
#include <stdio.h>
int go(int); //if I omit this prototype, program outputs 1 which is far from correct answer :)
main(){
double b=33453.834;
go(b);
}
所以最后答案只能是未定义的行为。
谢谢马克西姆·斯库里丁