当前位置: 技术问答>linux和unix
函数原型与定义的问题
来源: 互联网 发布时间:2016-09-04
本文导语: 我在文件a.c中定义一个函数 //a.c void display(float d,char i) { printf("float = %f,char = %x n",d,i); } 然后在另一个文件b.c中使用它 //void display(float d,char i); int main() { float d = 10.0; char j ...
我在文件a.c中定义一个函数
然后在另一个文件b.c中使用它
gcc -c a.c b.c
gcc a.o b.o -o a
我在b.c中加上函数的声明void display(float d,char i);就成功了
没有加上函数的声明,该函数也可以调用 但是打印的结果是错的
加上声明,这样可以让函数的声明与定义是一致的 所以可以执行正确
没有加上的话 main为什么会执行错?它会到哪儿去找函数的声明?
//a.c
void display(float d,char i)
{
printf("float = %f,char = %x n",d,i);
}
然后在另一个文件b.c中使用它
//void display(float d,char i);
int main()
{
float d = 10.0;
char j = 3;
display(d,j);
}
gcc -c a.c b.c
gcc a.o b.o -o a
我在b.c中加上函数的声明void display(float d,char i);就成功了
没有加上函数的声明,该函数也可以调用 但是打印的结果是错的
加上声明,这样可以让函数的声明与定义是一致的 所以可以执行正确
没有加上的话 main为什么会执行错?它会到哪儿去找函数的声明?
|
编译b.c的时候,如果调用display之前没见过display的函数声明,编译器不会去任何地方找,而是会根据调用的情况来自动生成一个函数声明。
在这里的display会被默认为返回int。至于参数是怎么声明的,我得再想想……
在这里的display会被默认为返回int。至于参数是怎么声明的,我得再想想……
|
这个和我的理解完全一致, 不过我也不是很有把握。
刚查了c99标准,找到这么一段:
6.5.2.2 Function calls
......
6 If the expression that denotes the called function has a type that does not include a
prototype, the integer promotions are performed on each argument, and arguments that
have type float are promoted to double. These are called the default argument
promotions.