1、函数的缺省认定。当程序中遇见一个没有定义原型的函数时,会默认函数返回一个整型值。对于那些并不返回整型的函数来说这种认定会产生错误。一个例子如下,函数func()返回一个float值3.14(010000000010000100111010011),假定函数是这样调用的:

1 float f;
2 f = func();

在函数调用之前,编译器不知道其原型,于是认定函数返回整型值,并产生指令将这个值转换成float,然后将其赋值给变量f

2、函数的参数。

传值调用不改变参数的值,凡是标量(就是值本身,包括各种基础数据类型,或者自定义结构)都是传值调用。数组参数是传址调用

3、ADT和黑盒

模块具有功能说明和借口说明,前者说明模块执行的任务,后者定义模块的实现。但是用户不能知道模块的实现细节,除了定义好的接口外,用户不能以任何方式访问模块。通过使用static关键字来限制对模块的访问,可以限制那些并非接口的函数和数据的访问。如此可实现在需要的时候对函数进行修改,而不影响用户的使用。

::只在头文件中定义接口和宏,以及一些抽象数据类型声明。要在模块实现文件的内部定义具体的数据结构。

::在实现文件中用static来修饰外部不能访问的函数接口

4、可变参数列表头文件  <stdarg.h>

头文件声明了一个类型va_list和三个宏va_start,va_arg,va_end。通过va_list来访问可变参数,va_start初始化va_list使其指向可变参数的第一个。可变参数一定要依次访问。一个例子:

1 #include <stdio.h>
2 #include <stdarg.h>
3 //测试可变参数,求多个数字的平均值
4 float average(int num,...)
5 {
6 va_list var_arg;
7 int count;
8 float sum = 0;
9
10 va_start(var_arg,num); //初始化可变参数类型,指向第一个可变参数
11 for(count=0;count<num;count++)
12 {
13 sum += va_arg(var_arg,int);//转换可变参数类型,因为默认缺省类型
14 }
15
16 va_end(var_arg);//结束可变参数处理
17
18 return sum/num;
19 }
20
21 int main()
22 {
23 printf("%5.3f\n",average(5,1,2,3,4,5)); //访问函数
24 return 0;
25 }

这些宏无法判断实际参数的数量,需要我们手工确定何时停止解析

这些宏无法判断每个参数的类型,我们也要手工使用va_arg宏来转换

5、一些提示

不可在其他函数的作用域内编写函数原型

要为返回值不是整型的函数编写原型

不可将函数原型与旧式风格的函数定义混合使用

在va_arg宏中使用错误的参数类型,会导致结果不确定

 posted on 2011-03-17 19:52  如是晴朗  阅读(185)  评论(0编辑  收藏  举报