繁体   English   中英

va_arg中的铸造方式

[英]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称这些默认参数提升 他们是:

  • 有符号或无符号charshort 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM