gpt4 book ai didi

C变量类型断言

转载 作者:太空狗 更新时间:2023-10-29 16:33:45 26 4
gpt4 key购买 nike

uint32_t fail_count = 0;

...

if(is_failed)
if(fail_count < UINT32_MAX - 1 )
++fail_count;

它工作正常,但这段代码很脆弱。明天,我可能会将 fail_count 的类型从 uint32_t 更改为 int32_t 而我忘记更新 UINT32_MAX

有什么方法可以断言 fail_count 是我编写 if 的函数中的 uint32_t

附言1-我知道这在 C++ 中很容易,但我正在寻找一种 C 方式。

附言2- 我更喜欢使用两个断言,而不是依赖编译器警告。通过 sizeof 检查数字大小应该可行,但是有什么方法可以区分类型是否是无符号的?

最佳答案

从 C11 开始,您可以使用 generic selection宏根据表达式的类型生成结果。您可以在 static assertion 中使用结果:

#define IS_UINT32(N) _Generic((N), \
uint32_t: 1, \
default: 0 \
)

int main(void) {
uint32_t fail_count = 0;
_Static_assert(IS_UINT32(fail_count), "wrong type for fail_count");
}

您当然可以在常规 assert() 中使用结果,但是 _Static_assert 将在编译时失败。

更好的方法是基于类型分派(dispatch)比较,再次使用泛型选择:

#include <limits.h>
#include <stdint.h>

#define UNDER_LIMIT(N) ((N) < _Generic((N), \
int32_t: INT32_MAX, \
uint32_t: UINT32_MAX \
) -1)

int main(void) {
int32_t fail_count = 0;

if (UNDER_LIMIT(fail_count)) {
++fail_count;
}
}

关于C变量类型断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55804149/

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