读者:怎样知道实际上有多少个参数传入函数?
阿一:一些旧系统提供一个非标准函数 nargs()。然而它的可 信度值得怀疑, 因为它的典型返回值是参数的字节长度, 而不是参数的个数。结 构、整数和浮点类型的值一般需要几个字节的长度。任何接收可变参数的函数都应该可以从传入的参数本身来得到参数的数目。类 printf 函数从格式字符串中的格式说明符来确定参数个数, 就象 %d 这样的格式 说明符。所以如果格式字符串和参数数目不符时, 此类函数会出错的很厉害。还有一个常用的技巧, 如果所有的参数是同一个类型, 在参数列最后加一个 标记值。通常用 0、-1 或适当类型转换的空指针。
读者:为什么当 n 为 long int, printf(“%d”, n); 编译时没有匹配警告?
阿一:当一个函数用可变参数时, 它的原型说明没有也不能提供可变参数的数目和 类型。所以通常的参数匹配保护不适用于可变参数中的可变部分。编译器不能执行内含的转换或警告不匹配问题。
读者:怎样写类似 printf() 的函数, 再把参数转传给 printf() 去完成大部分工作?
阿一:用 vprintf(), vfprintf() 或 vsprintf()。
正文完