[英]Way of casting in va_arg
我正在研究可变参数函数和参数。
我注意到va_arg能够将对象转换为其他对象。 例如,当下一个参数是char
,但您正在使用va_arg
就像它应该是一个int
,它会将char
转换为一个int
:
函数调用:
AddNumbers(3, 5, 'a', 20);
函数声明:
int AddNumbers(int count, ...) {
int result;
va_list va;
va_start(va, count);
for(int i = 0; i < count; ++i) {
result += va_arg(va, int);
}
return result;
}
所以我的问题是:此函数使用哪种类型的转换(C样式,dynamic_cast等)?
它与铸造无关。 在这种情况下,它的工作是因为提倡争论。
当您使用varargs函数时, 小于int
整数类型(例如char
)将被提升为 int
。
这就是为什么在将字符文字传递给函数时它起作用的原因。 如果尝试其他类型,例如浮点值,则它将不再起作用。
至于va_arg
宏(主要是作为宏实现)的作用,则完全取决于实现。 它可能根本不进行任何强制转换,而是使用其他形式的punning类型 。
如果我正确理解您的问题:
默认情况下,C在调用可变参数函数时执行某些“转换”。 GCC称这些默认参数提升 。 他们是:
char
和short int
成为有符号或无符号int
。 float
变成double
。 这实际上不是va_arg
在 AddNumbers
; 相反, 在调用 AddNumbers
,调用方AddNumbers
参数提升到AddNumbers
,这是将其推入堆栈以供AddNumbers
使用的一部分。
这不是完全强制转换,因为va_arg
是宏,而不是函数。 所以va_arg(va, int)
的类型是通过 int
构造的 。
但是,在调用可变参数函数时确实会发生升迁 (省略号之前的参数除外)。
所以在AddNumbers(3, 5, 'a', 20);
,字符'a
”被提升为int。 然后,您可以像代码一样将其用作int,也可以将其转换回定义的char(转换而不是强制转换),因为int值可以表示为char(通过构造)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.