基础知识练习
士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭
读者:怎样写类似 printf() 的函数, 再把参数转传给 printf() 去完成大部分工作?
小林:用 vprintf(), vfprintf() 或 vsprintf()。下面是一个 error() 函数, 它列印一个出错信息, 在信息前加入字符串 “error: ”和在信息后加入换行符:
#include <stdio.h>
#include <stdarg.h>
void error(const char *fmt, ...)
{
va_list argp;
fprintf(stderr, "error: ");
va_start(argp, fmt);
vfprintf(stderr, fmt, argp);
va_end(argp);
fprintf(stderr, "\n");
}
读者:怎样知道实际上有多少个参数传入函数?
小林:这一段信息不可移植。一些旧系统提供一个非标准函数 nargs()。然而它的可信度值得怀疑, 因为它的典型返回值是参数的字节长度, 而不是参数的个数。结构、整数和浮点类型的值一般需要几个字节的长度。
任何接收可变参数的函数都应该可以从传入的参数本身来得到参数的数目。类 printf 函数从格式字符串中的格式说明符来确定参数个数, 就象 %d 这样的格式说明符。所以如果格式字符串和参数数目不符时, 此类函数会出错的很厉害。