可变参数函数中的大小整数和提升

Sized integers and promotions in varargs functions

大小整数(来自 stdint.h 的整数)实际上是标准 C 类型的类型定义。因此,适用于可变参数(varargs)函数(如 printf())的 "default arguments promotions" 也将应用于它们,以便将 char 和 short 转换为 int(有符号或无符号)。

我正在编写一个类似 printf 的函数,专为大小整数设计。它有一个格式字符串,其中包含可变参数列表中所有整数的大小信息。

我应该如何编写可变参数查询代码,以便它以正确的大小检索每个参数?我想我的函数需要知道默认参数提升,但它们是 compiler/system-dependent,因为这取决于系统是否具有 16/32/64 位 int。我怎样才能以独立于编译器的方式获得正确的参数?

要确定 some type 是否变为 intunsigned 或在传递给具有 ... 的函数时保持相同类型,代码可以使用 _Generic() . (C99 或更高版本)

通过使用 *1,这模仿了 f(format, ...) 中常见的促销活动。

现在您的 printf 类函数 可以确定参数是提升为 intunsigned 还是保持原样。

#include <stdio.h>
#define PromoType(v) _Generic(v*1, \
  unsigned : "unsigned", \
  int : "int", \
  default: "no change" \
  )

int main(void) {
  int16_t i16;
  puts(PromoType(i16));
  uint16_t u16;
  puts(PromoType(u16));
  int32_t i32;
  puts(PromoType(i32));
  uint32_t u32;
  puts(PromoType(u32));
  int64_t i64;
  puts(PromoType(i64));
  uint64_t u64;
  puts(PromoType(u64));
  return 0;
}

输出

int
int
int
unsigned
no change
no change