在编译时获取size_t中的位数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在编译时获取size_t中的位数相关的知识,希望对你有一定的参考价值。

我试图获得size_t中的值位数用于预处理器指令。也许这有一个宏?从本质上讲,我想实现类似于这个代码的东西,其中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
答案

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中的值位数。这可能与总比特不同。


注意:SIZE_MAX的定义是这样的

这些宏的每个实例都应该被适合在#if预处理指令中使用的常量表达式替换,并且该表达式应该具有与根据整数提升转换的相应类型的对象的表达式相同的类型。 C11§7.20.32

另一答案

这适用于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中的位数的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的“var”是不是类似于 C 中的“size_t”?

如何从 Firebase 获取数据到 Recyclerview 中的片段?

在 JSP 中的 <% %> 代码片段中添加链接

Android获取片段中的布局高度和宽度

导致资产预编译在heroku部署上失败的代码片段

片段中的 notifyDataSetChanged() 不刷新列表视图