一、函数定义
二、函数声明
当编译器遇到一个函数的调用时,它产生代码传递参数并调用这个函数,而且接受该函数返回的值(如果函数有返回值的话)。
1、原型:
编译器如何知道函数信息的?
a、函数原型放在源文件的前面,编译器就会记住它的参数数量和类型,以及函数的返回值类型。这样编译器便可以检查函数的所有后续调用(在同一源文件中),确保它们是正确的。
b、使用“函数原型”。即,将函数原型至于一个单独的文件,当其它源文件需要这个函数的原型时,就好似用“#include”指令包含该文件。
使用函数原型的好处:
a、函数原型具有文件作用域,所以原型的一份拷贝可以作用域整个源文件。
b、函数原型只书写一次以避免多分原型的拷贝之间的不匹配。
c、如果函数定义的修改,我们只需要修改函数原型即可。
d、如果函数的原型同时也被“#include”指令包含到定义函数的文件中,编译器就可以确认函数原型与函 数定义的匹配。
三、函数的参数
C函数的所有参数均已“值传递”的方式进行传递,即函数将获得参数值的一份拷贝。当传递指针参数时,也是“值传递”,传递地址值。所有在函数中我们是根据传递的地址值对地址进行操作的。
可变参数列表:
在函数原型中,列出了函数期望接受的参数,但原型只能显示固定数目的参数,如何让一个函数在不同的时候接受不同数目的参数呢?
stdarg宏:
可变参数列表时通过宏来实现的,这些宏定义在stdarg.h头文件中,他是标准库的一部分。这个头文件声明了一个类型va_list和三个宏
——va_start、va_arg和va_end。
先来个程序例子吧:
/**
Function:to calculate the average
Time:06/03/2010
**/
#include <stdarg.h>
float
average(int n_values, ...)
{
va_list var_arg;
int count;
float sum = 0;
/**
to prepare the parameters which we will used
**/
va_start(var_arg, n_values);
/**
to get each parameters
**/
for(count = 0; count < n_values; count++){
sum += va_arg(var_arg, int );
}//end for
/**
to deal the parameters
**/
va_end(var_arg);
return sum/n_values;
} |
程序解释:
函数声明可以声明一个va_list类型的变量,变量名为
var_arg。通过调用va_start()来初始化,它的第1个参数是va_list变量名字,第2个参数是省略号前最后一个有名字的参数。
为了访问参数,需要使用va_arg(),这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型。
最后,当访问完最后一个可变参数后,我们需要调用va_end()。
注:可变参数列表,仅支持可变参数的顺序访问。如果在顺序访问几个参数后中途终止是可以的,但是不能跳跃式的访问可变参数。
阅读(730) | 评论(0) | 转发(0) |