在编译时,是否可以在不使用CHAR_BIT的情况下确定CHAR_BIT的值?需要包含 吗?
为了让使用Clang进行跨编译的C 代码能够使用 CHAR_BIT,需要包含 <limits.h>。要包含 <limits.h>,需要同时指定 --sysroot 和 -isystem 这两个选项。出于某些原因,似乎并不想指定这些选项。
当前人们使用 __CHAR_BIT__ 代替 CHAR_BIT。然而,是否存在某种技巧,可以在翻译阶段(可靠地)确定 CHAR_BIT 的值,而不使用 CHAR_BIT?例如,使用一系列(算术)运算。
解决方案
此答案 为我们提供了这个宏:
/* Number of bits in inttype_MAX, or in any (1<<b)-1 where 0 <= b < 3E+10 */
#define IMAX_BITS(m) ((m) /((m)%0x3fffffffL+1) /0x3fffffffL %0x3fffffffL *30 \
+ (m)%0x3fffffffL /((m)%31+1)/31%31*5 + 4-12/((m)%31+3))
我们可以将其应用于最大 unsigned char 值,该值通过 (unsigned char) -1 获得,以得到位数,前提是它小于32,000,000,000位:
#include <stdio.h>
int main(void)
{
#define IMAX_BITS(m) ((m) /((m)%0x3fffffffL+1) /0x3fffffffL %0x3fffffffL *30 \
+ (m)%0x3fffffffL /((m)%31+1)/31%31*5 + 4-12/((m)%31+3))
printf("%ld\n", IMAX_BITS((unsigned char) -1));
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。