gpt4 book ai didi

c - 检索传递给可变参数函数的 int32_t 的可移植方法

转载 作者:太空狗 更新时间:2023-10-29 16:55:59 24 4
gpt4 key购买 nike

7.16.1.1 2描述 va_arg如下(强调我的):

If there is no actual next argument, or if type is not compatible with the type of the actual next argument (as promoted according to the default argument promotions), the behavior is undefined, except for the following cases:

  • one type is a signed integer type, the other type is the corresponding unsigned integer type, and the value is representable in both types;
  • one type is pointer to void and the other is a pointer to a character type.

根据我的理解,6.5.2.2(函数调用)似乎与我并不矛盾,尽管我可能是错的,默认的提升是:

  • charintunsigned (具体实现)
  • signed charint
  • unsigned charunsigned
  • shortint
  • unsigned shortunsigned
  • floatdouble

当您知道传递给 va_list 的确切基础类型时,这一切都很好而且花花公子。 (除了 char ,AFAIK 无法便携检索,因为它的签名是指定的实现)。

当您期望来自 <stdint.h> 的类型时,它会变得更加复杂将传递给您的 va_list .

  • int8_tint16_t ,通过逻辑极限观察扣除,保证被提升或已经是类型 int .然而,依赖我的原始“逻辑”极限观察是非常可疑的,所以我正在寻求你(和标准)对这个推论的确认(我可能会遗漏一些我什至没有的极端情况意识到)。
  • 同样适用于 uint8_tuint16_t , 除了基础类型是 unsigned
  • int32_t 可能会也可能不会升级为int .它可能大于、小于或完全等于 int .同样适用于 uint32_t但对于 unsigned . 如何便携检索int32_tuint32_t传递给 va_list ? 换句话说,如何确定 int32_t ( uint32_t ) 已升级为 int ( unsigned )? 换句话说,如何确定我是否应该使用 va_arg(va, int)va_arg(va, int32_t)检索 int32_t传递给可变参数函数而不调用任何平台上的未定义行为?
  • 我相信同样的问题适用于 int64_tuint64_t .

这是一个理论问题(仅涉及标准),假设 <stdint.h> 中的所有精确宽度类型存在。我对“实践中的真实情况”类型的答案不感兴趣,因为我相信我已经知道了。

编辑

我想到的一个想法是使用 _Generic确定 int32_t 的基础类型.我不确定你会如何使用它。我正在寻找更好(更简单)的解决方案。

最佳答案

#define IS_INT_OR_PROMOTED(X) _Generic((X)0 + (X)0, int: 1, default: 0)

用法:

int32_t x = IS_INT_OR_PROMOTED(int32_t) ? 
(int32_t)va_arg(list, int) :
va_arg(list, int32_t);

在我的 PC 上使用 gcc,宏为 int8_tint16_tint32_t 返回 1,为 int64_t 返回 0 >。

对于 gcc-avr(一个 16 位目标),宏为 int8_tint16_t 返回 1,为 int32_tint64_t

对于 long,无论 sizeof(int)==sizeof(long) 是否存在,宏都会返回 0。

我没有任何带有 64 位 int 的目标,但我不明白为什么它不能在这样的目标上工作。

虽然我不确定这是否适用于真正病态的实现实际上我现在很确定它适用于任何符合规范的实现。

关于c - 检索传递给可变参数函数的 int32_t 的可移植方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48008350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com