检查预处理器中整数类型的大小

mya*_*hya 14 c++ sizeof c-preprocessor

如何unsigned在g ++下检查预处理器中的a 的大小?sizeof因为在预处理期间没有定义它,所以是不可能的.

Spa*_*rky 26

这可能不是最优雅的方法,但您可以利用的一件事是在"limits.h"中定义的UINT_MAX.那是, ...

如果UINT_MAX == 65535,那么你就知道sizeof(unsigned)= 2

如果UINT_MAX == 4294967295,那么你就会知道sizeof(unsigned)= 4.

等等.

正如我所说,不优雅,但它应该提供一定程度的可用性.

希望这可以帮助.

  • 从技术上讲,整数的大小可能比这个技术预测的要大,因为`unsigned`被允许有填充位,或者更小,因为CHAR_BIT不需要8.所以为了正确,它可能也值得在某个地方断言(在测试中,也许),'sizeof`确实给出了预期的大小.在实践中,你可以高度自信地说它不会发生. (3认同)
  • 预处理器应该能够做一些数学运算,比如`#if UINT_MAX >> 8 == 0 // 1 byte` ... `#elif UINT_MAX >> 16 == 0 //two bytes` 等等? (2认同)
  • 如果`UCHAR_MAX == UINT_MAX` 那么`sizeof(1U)` _probably_ 是一。但它仍然可能是3。 (2认同)

mya*_*hya 9

根据Sparky的回答,这里有一种看起来更好的方式(通过消除显式数字)

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

//Check if size if 4bytes
#if UINT_MAX == UINT32_MAX

....

#endif
Run Code Online (Sandbox Code Playgroud)

<limits.h>定义INT_MAX<stdint.h>定义UINT32_MAX.通常,<stdint.h>给出具有指定宽度的整数类型.