我注意到C标准的7.16.1.1p2确实允许使用与实际可变参数类型不兼容的类型来访问可变参数,只要通过va_arg
给出的类型与相应的实际参数不同即可。可变参数类型仅在有符号的情况下...:
...除以下情况外,行为是不确定的:
- 一种类型是有符号整数类型,另一种类型是相应的 无符号整数类型,并且该值在两种类型中均可表示;
- 一种类型是指向void的指针,另一种是指向字符的指针 类型。
和值在两种类型中都是可表示的。
最后一个要求与通过指针访问的严格别名规则形成对比。该规则允许通过指针访问对象,该指针的目标类型与对象的有效类型仅在签署上有所不同,并且该规则无需对目标对象的值施加任何要求:
一个对象的存储值只能由左值访问 表达式具有以下类型之一:88)
- ...
- type是与之对应的有符号或无符号类型 对象的有效类型,
- ...
这种差异的依据是什么?为什么不同签名的va_arg
访问和不不同签名的指针访问都应该关心可表示的值?