C++ Gcc扩展或宏,用于检查编译时用于某些基本类型的位
在编译时,使用一些C++ Gcc扩展或宏,用于检查编译时用于某些基本类型的位,c++,c,gcc,clang,C++,C,Gcc,Clang,在编译时,使用一些static\u asserts,我想检查一些简单类型(如unsigned int或char)的大小(以位为单位),考虑到我的使用情况,这一点很重要 我在gcc手册中没有找到任何关于这方面的信息,我也不知道clang提供的类似功能,有人知道如何检查类型使用的位数吗 请不要太大,我的重点是位和编译时间 请不要太大,我的重点是位和编译时间 保持开放的心态-P #include <cstdint> static_assert(sizeof(X) * CHAR_BIT =
static\u assert
s,我想检查一些简单类型(如unsigned int
或char
)的大小(以位为单位),考虑到我的使用情况,这一点很重要
我在gcc
手册中没有找到任何关于这方面的信息,我也不知道clang
提供的类似功能,有人知道如何检查类型使用的位数吗
请不要太大,我的重点是位和编译时间
请不要太大,我的重点是位和编译时间
保持开放的心态-P
#include <cstdint>
static_assert(sizeof(X) * CHAR_BIT == 32, "type X must be 32 bits in size");
#包括
静态断言(sizeof(X)*字符位==32,“类型X的大小必须为32位”);
根据,gnu编译器将为您定义以下宏:
__CHAR_BIT__ // bits
__SIZEOF_INT__ // bytes
__SIZEOF_LONG__
__SIZEOF_LONG_LONG__
etc...
只需乘以8,就可以从字节宏定义自己的位宏
编辑:因为您显然需要知道“Word Stand”,并认为指针与“Word”大小相同,然后使用这个:
__SIZEOF_POINTER__
1.如何在不使用CHAR\u BIT
宏的情况下查找类型中的位数
如果类型是数字类型(如int
和char
),则可以使用std::numeric\u limits::digits
,假设T
是二进制类型(即std::numeric\u limits::radix==2
),获得有效位的数量。它们是constexpr
,因此可以在static\u assert
中使用
可能的情况是,该实现不能够使用某些数字类型中的所有存储位(除了char
),在这种情况下,有效位数的数量可能与以位为单位的物理大小无关。此外,符号位不计数,因此需要添加std::numeric\u limits::is\u signed
,以获得非填充位的数量
由于char
类型不允许有填充和char
,signed char
和unsigned char
要求大小完全相同,std::numeric\u limits::digits
必须是char
中的位数,否则称为所需的宏char\u BIT
。因此,您可以互换使用这两个表达式,因此任何类型的T
的位大小(物理的,没有意义的)将是sizeof(T)*std::numeric\u limits::digits
我不认为编译器本身需要知道char
的位大小(尽管大多数编译器可能知道)。它确实需要知道每个基元类型的sizeof(T)
是什么。如果不包含一些头文件,就没有标准的强制方法来计算std::numeric\u limits::digits
的值
2.为什么你不应该担心它。
在独立环境中,
不是必需的,但
仍然是必需的,因此即使在独立环境中,您也可以依靠字符位
,而在托管环境中,您只能依靠std::numeric\u limits::digits
换句话说,编译器必须以某种方式提供#include
的结果,因为即使在独立的环境中(即没有标准库甚至没有操作系统的环境中),标准也需要该标头。这就是你要寻找的“内在的”;即使在标准库实现中没有提供
,即使手头没有标准库,编译器仍必须在出现\include
后正确定义宏字符位。如何做到这一点取决于编译器<代码>
不必是实际文件
笔记
static\u assert
声明,但它只适用于C11样式的常量表达式,而不适用于C++样式的常量表达式。C++常量表达式可以使用诸如“代码> CONTXPRP</代码>函数,这些函数可能是内置的。另一方面,C常量表达式只能涉及整数文本。它们仍然很有用(对于非纯粹主义者),因为宏首先展开,宏可以展开为整数文本(甚至是包含多个整数文本的表达式)为什么你认为sizeof不能在编译时进行测试?@texasbruce更关心的是
sizeof
案例中的位数,我刚刚明确了我想要达到的两个目标。你能详细说明一下CHAR\u BIT
不适合你的原因吗?如果您想要一个内置的,Gcc和Clang似乎有\uuuu CHAR\u BIT\uuu
..@maf所以我想实现它,我的问题是找到一个可行的解决方案,关于如何为这种符号注入正确的值<代码>\uuuu CHAR\u BIT\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。问题解决了一半。你想实现什么?是的,但有一个小问题,正确的结果基本上取决于CHAR\u BIT
的正确值,这是一个宏,static\u assert
基本上依赖于一个宏,而这个宏又由另一个ifdef
voodo magic定义;这就是为什么我要求一些编译器内置,我只想反馈类型并得到位数。主要的一点是,那些ifdef
需要有一个好的与之相关联的条件,这就是我首先要找到的。@user2485710你说的条件魔法和巫毒魔法是什么意思?它只是一个预处理器。如果你想在编译时测试一些东西,而不想使用预处理器,那么你就不走运了。@texasb