1、函数的缺省认定。当程序中遇见一个没有定义原型的函数时,会默认函数返回一个整型值。对于那些并不返回整型的函数来说这种认定会产生错误。一个例子如下,函数func()返回一个float值3.14(010000000010000100111010011),假定函数是这样调用的:
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使其指向可变参数的第一个。可变参数一定要依次访问。一个例子:
2 #include <stdarg.h>
3 //测试可变参数,求多个数字的平均值
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宏中使用错误的参数类型,会导致结果不确定