Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1839301
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类: C/C++

2010-06-03 19:02:03

一、函数定义

类型
函数名 ( 形式参数 )
{
    代码块
}


二、函数声明
当编译器遇到一个函数的调用时,它产生代码传递参数并调用这个函数,而且接受该函数返回的值(如果函数有返回值的话)。
  
  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()。

注:可变参数列表,仅支持可变参数的顺序访问。如果在顺序访问几个参数后中途终止是可以的,但是不能跳跃式的访问可变参数。


阅读(706) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~