因为, 等被定义为宏,看起来很愚蠢。 变量参数的类型和个数完全由该函数中的程序代码控制,无法智能识别不同参数的个数和类型。 有人可能会问:不是实现了参数的智能识别吗? 那是因为函数从固定参数字符串中分析出参数类型,然后调用获取可变参数。 的原型检查不够严格,不利于编程错误检查。 若将()改为:
无效(整数我,...)
;
字符 *s=NULL;
(, 我);
s=(, 字符*);
();
("%d %s\n", i, s);
;
变量参数为char*类型。 当我们忘记使用两个参数来调用函数时,就会出现核心转储(Unix)或页面非法错误(平台)。 但可能没有错误,但错误却很难发现,这不利于我们编写高质量的程序。
下面提到va系列宏的兼容性。 V Unix 将其定义为只有一个参数的宏:
( );
ANSI C 定义为:
( , );
如果我们想使用V的定义,我们应该使用.h头文件中定义的宏。 ANSI C的宏和V的宏不兼容,我们一般用ANSI C,所以ANSI C的定义就够了,而且也方便程序移植。