使用大小不小于int的自定义类型配合va_arg是否符合C语言规范?
关于va_arg使用自定义结构体类型的合规性
结论
完全符合C语言规范。
具体解释
C标准对va_arg的核心要求是:第二个参数必须是完整的对象类型(比如已定义的结构体、联合体、基础数据类型等),和类型的大小是否大于等于int没有关联。
对于可变参数函数的实参,只有部分基础类型会触发默认参数提升(比如char/short会提升为int,float会提升为double),但自定义结构体类型不属于默认提升的范畴——调用时传入的mystruct_t类型实参不会被修改类型,因此用va_arg(a_list, mystruct_t)直接获取该类型的值是完全合规的。
只要你的代码满足两个前提:
mystruct_t是已经完整定义的结构体类型- 调用可变参数函数时,对应位置传入的确实是
mystruct_t类型的对象
那示例中的代码mystruct_t v = va_arg(a_list, mystruct_t);就完全符合C语言规范。
内容的提问来源于stack exchange,提问作者Edwin Skeevers
相关产品推荐
相关产品推荐

