在编译时获取 size_t 中的位数
Get number of bits in size_t at compile time
我正在尝试获取 size_t
中 value 位的数量,以用于预处理器指令。也许有一个宏?本质上,我想实现类似于此代码的东西,其中 SIZE_T_BITS
是为了演示而假设的宏。
#if SIZE_T_BITS == 32
// code for 32 bit size_t
#elif SIZE_T_BITS == 64
// code for 64 bit size_t
#else
// code for other bit sizes of size_t
#endif
这适用于 GCC、CLang 和 MSVC:
#if defined(__x86_64__) || defined(_IA64) || defined(__IA64__) || defined(_M_X64)
#define SIZE_T_BITS 64
#else
#define SIZE_T_BITS 32
size_t
是某种无符号类型。将最大值与普通候选值进行比较。最大值肯定是一些 2SIZE_T_BITS - 1。最小的 SIZE_MAX
可能是 0xFFFF
.
#include <stdint.h>
#if (SIZE_MAX == 0xFFFF)
#define SIZE_T_BITS 16
#elif (SIZE_MAX == 0xFFFFFFFF)
#define SIZE_T_BITS 32
#elif (SIZE_MAX == 0xFFFFFFFFFFFFFFFF)
#define SIZE_T_BITS 64
#else
#error TBD code SIZE_T_BITS
#endif
虽然 size_t
可能有填充位(这种情况很少见),但 about 方法反映了 size_t
中 value 位的数量。这可能不同于 total 位。
注意:SIZE_MAX
的定义使得
Each instance of these macros shall be replaced by a constant expression suitable for use in #if
preprocessing directives, and this expression shall have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. C11 §7.20.3 2
我正在尝试获取 size_t
中 value 位的数量,以用于预处理器指令。也许有一个宏?本质上,我想实现类似于此代码的东西,其中 SIZE_T_BITS
是为了演示而假设的宏。
#if SIZE_T_BITS == 32
// code for 32 bit size_t
#elif SIZE_T_BITS == 64
// code for 64 bit size_t
#else
// code for other bit sizes of size_t
#endif
这适用于 GCC、CLang 和 MSVC:
#if defined(__x86_64__) || defined(_IA64) || defined(__IA64__) || defined(_M_X64)
#define SIZE_T_BITS 64
#else
#define SIZE_T_BITS 32
size_t
是某种无符号类型。将最大值与普通候选值进行比较。最大值肯定是一些 2SIZE_T_BITS - 1。最小的 SIZE_MAX
可能是 0xFFFF
.
#include <stdint.h>
#if (SIZE_MAX == 0xFFFF)
#define SIZE_T_BITS 16
#elif (SIZE_MAX == 0xFFFFFFFF)
#define SIZE_T_BITS 32
#elif (SIZE_MAX == 0xFFFFFFFFFFFFFFFF)
#define SIZE_T_BITS 64
#else
#error TBD code SIZE_T_BITS
#endif
虽然 size_t
可能有填充位(这种情况很少见),但 about 方法反映了 size_t
中 value 位的数量。这可能不同于 total 位。
注意:SIZE_MAX
的定义使得
Each instance of these macros shall be replaced by a constant expression suitable for use in
#if
preprocessing directives, and this expression shall have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. C11 §7.20.3 2