对于数组,元素编号的混淆是-1

Bla*_*mba 8 c++

我正在读这里的代码: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];
Run Code Online (Sandbox Code Playgroud)

(void) require_32_bit_integer_at_least; // no warning please
Run Code Online (Sandbox Code Playgroud)

他们的目的是什么?

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;
}
Run Code Online (Sandbox Code Playgroud)

ser*_*gej 7

该代码要求a int至少为32位宽.如果不是这种情况并且sizeof(int)小于32位,则会出现如下错误:

error: size of array 'require_32_bit_integer_at_least' is negative
Run Code Online (Sandbox Code Playgroud)

这条线

(void) require_32_bit_integer_at_least; // no warning please
Run Code Online (Sandbox Code Playgroud)

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


正如@MartinBonner所提出的,为了使它更清晰和更容易使用,我们可以定义一个"静态断言"宏:

#define STATIC_ASSERT(EXPR, MSG) typedef char static_assertion_##MSG[(EXPR) ? 1 : -1]
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用:

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

const bool foo = true;
STATIC_ASSERT(foo, foo_is_not_true); 
Run Code Online (Sandbox Code Playgroud)