使用 stdarg 的一些注意事项

stdarg 给C语言提供一种可变参数的功能,最常见的例子为 stdio 中的 printf 函数。

1、stdarg 仅支持整数、浮点数和指针(数组),其他如结构体是未定义行为。

2、stdarg 在入参时会对参数会进行默认的提升,比如所有低于整数会提升到 int, 低于 double 的会提升到 double.

3、在使用 type va_arg ( va_list ap, type ) 取参数时,为了保留整数的符号位,可统一按照有符号整数进行数据类型转换。

4、c99 中 stdarg 加入了对 64 位整数的支持

5、综合2、3、4,va_arg 中的 type 只应该出现 int, int64_t, double, void *

6、在 gcc 中,stdarg 是由编译器在编译时实现的,而非写好的宏或函数等。这样编译器可以做一些优化。

7、永远不要将混用数据类型,如入参时放入的是浮点数,取参却用 int 或 int64_t 这是一个未定义的操作。详细分析请看这边文章:x86-64体系下一个奇怪问题的定位

8、c99 中新增了va_copy,以进行安全的 va_list 对象的复制操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注