gpt4 book ai didi

c++ - 对数组的元素编号感到困惑是-1

转载 作者:可可西里 更新时间:2023-11-01 16:37:21 25 4
gpt4 key购买 nike

我正在阅读这里的代码: https://github.com/chenshuo/muduo/blob/master/muduo/base/Date.cc

但我对这两行感到困惑:

char require_32_bit_integer_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1];

(void) require_32_bit_integer_at_least; // no warning please

他们的目的是什么?

char require_32_bit_integer_at_least[sizeof(int) >= sizeof(int32_t) ? 1 : -1];

int getJulianDayNumber(int year, int month, int day)
{
(void) require_32_bit_integer_at_least; // no warning please
int a = (14 - month) / 12;
int y = year + 4800 - a;
int m = month + 12 * a - 3;
return day + (153*m + 2) / 5 + y*365 + y/4 - y/100 + y/400 - 32045;
}

最佳答案

代码要求 int 至少为 32 位宽。如果不是这种情况并且 sizeof(int) 小于 32 位,您将收到如下错误:

error: size of array 'require_32_bit_integer_at_least' is negative

线

(void) require_32_bit_integer_at_least; // no warning please

似乎是为了避免“未使用的变量”警告。但是,由于数组是全局的和非静态的,编译器无论如何都不会生成警告。要知道全局非静态变量确实未被使用,需要检查整个项目中的所有翻译单元(源文件)。


正如@MartinBonner 所提议的,为了使其更清晰和更易于使用,我们可以定义一个“静态断言”宏:

#define STATIC_ASSERT(EXPR, MSG) typedef char static_assertion_##MSG[(EXPR) ? 1 : -1]

并按如下方式使用它:

STATIC_ASSERT(sizeof(int) >= sizeof(int32_t), int_is_less_than_32_bit);    

const bool foo = true;
STATIC_ASSERT(foo, foo_is_not_true);

关于c++ - 对数组的元素编号感到困惑是-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385247/

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