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