C/C++函数原型

C/C++函数原型与函数定义

1.返回值

函数定义的返回值:

被调函数在返回一个数据的时候,会将返回值放在一块空间(内存或者寄存器),所以,函数定义的返回值决定被调函数返回什么值也就是说,被调函数要把这个返回值放到多大的内存中(不同类型占用空间大小不同不同)

函数原型的返回值:

被调函数返回一个值(将返回值放在某一空间)后,主调函数会得到这个返回值的地址,除了知道地址,还要知道空间大小才能确定返回值所以,函数原型的返回值类型,告诉主调函数返回了什么类型

使用下面代码证明上面的结论:

/*main.c*/
#include <stdio.h>


char f();

int main(void){

    printf("%d", f());
}

将原型与定义分开到两个文件,否则会冲突

/*test.c*/
int f(){
    return 0x11111111;
}

如果结论是对的,被调向空间中写入4个字节的数据,每个字节为0x11,但是根据函数原型,主调认为返回值只有一个字节,所以,会输出0x11,也就是17

运行结果是17

2.参数列表

静态类型检查:

编译阶段,系统会根据函数原型来检查函数调用,检查参数类型、参数个数是否匹配(对于有意义的赋值,系统会进行强制类型转换,比如所函数接受double型,而实参为int型,这样,系统会进行强制类型转换)

所以,函数原型可以检测函数调用时的参数是否匹配

将上面的例子稍加修改

/*main.c*/
#include <stdio.h>


char f(int a);

int main(void){

    int a;
    printf("%d", f(a));
}

同样分两个文件

/*test.c*/
int f(void){
    return 0x11111111;
}

可以看到,函数定义时,没有形参列表;而在函数原型中,由参数,所以,在调用时,我们提供一个参数,结果:没有报错

3.省略函数原型的情况

定义在第一次调用之前,就可以不用原型在现实中,所有的函数定义写到调用之前,这是一种不现实的情况;我们更多的会把一个程序分成多个文件,这样,函数原型就是必不可少的

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/88808655