5楼的函数重载只能解决一些情况,不能解决全部情况。比如一个函数根据问题的不同,可以接收1~n个任意数量的参数,每个参数的类型假设只有short、char、int、float、double这五种以及他们的指针型,共计10种,那么如果要用函数重载,那么必须要写10+10^2+10^3+……10^n=10(10^n-1)/9个函数,哪怕这个n只有2,也要写110个函数,而到3的时候要写1110个函数,这个工作量是惊人的。
6 7 9楼的方法只能一定程度上解决参数类型不确定的问题,因为在函数体中,类型转换的结果类型是定好了的,既然是定好了类型,又何谈类型不确定?而且参数数量不确定解决不了。
8楼的全局变量也有局限,比如一个计算平均值的函数,在不同的时刻输入的数据都不相同。如果这个程序只是给你自己用还好说,每次改一下代码,再编译运行就行了。但是如果是给客户用的话就行不通了,因为客户没办法改代码。
可变参数函数就能解决这个问题。在可变参数列表中的“……”之前必须至少有一个命名参数,这个命名参数起两个作用,第一是对可变参数的定位,这样va_start这个宏就可以通过它找到可变参数在函数堆栈中的起始位置;第二则是一个必须遵守的原则——这个命名参数必须以一定的形式提示可变参数的数量和类型。举个例子,大家熟悉的scanf()和printf()就是一个典型的可变参数函数,而这两个函数的命名变量就是最开头的那串格式字符串,而这个格式字符串中的各种格式码就提示了后面的可变参数列表中参数的类型和数量。这样,通过命名参数提示的信息,就可以用宏va_arg分别读取后面的可变参数。这样一来,参数的数量和类型不确定的情况便都得到了解决。