【问题标题】:Checking the sizeof an integer type in the preprocessor在预处理器中检查整数类型的大小
【发布时间】:2011-02-04 19:26:27
【问题描述】:

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

【问题讨论】:

标签: c++ c-preprocessor sizeof


【解决方案1】:

这可能不是最优雅的方法,但您可以利用的一件事是“limits.h”中定义的 UINT_MAX。也就是……

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

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

等等。

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

希望这会有所帮助。

【讨论】:

  • 这是一个有效答案,不在“重复”问题中。所以,我投票决定重新开放。
  • 预处理器应该能够做一些数学运算,比如#if UINT_MAX >> 8 == 0 // 1 byte ... #elif UINT_MAX >> 16 == 0 //two bytes 等等?
  • 从技术上讲,整数的大小可能比这种技术预测的要大,因为unsigned 允许有填充位,或者更小,因为 CHAR_BIT 不需要是 8。所以为了正确性,它可能也值得在某处(也许在测试中)断言sizeof 确实给出了预期的大小。在实践中,您可以满怀信心地说这不会发生。
  • 谢谢,我添加了一个答案只是为了解决显式插入值的需要。
  • 如果UCHAR_MAX == UINT_MAX 那么sizeof(1U) 可能是一个。但它仍然可能是 3。
【解决方案2】:

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

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

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

....

#endif

&lt;limits.h&gt; 定义 INT_MAX&lt;stdint.h&gt; 定义 UINT32_MAX。一般&lt;stdint.h&gt; 给出指定宽度的整数类型。

【讨论】:

  • 这在 gcc 下有效,在 g++ 下可能会出现问题。 Sparky 的解决方案更通用
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多