Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Gcc扩展或宏,用于检查编译时用于某些基本类型的位_C++_C_Gcc_Clang - Fatal编程技术网

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
后正确定义宏
字符位。如何做到这一点取决于编译器<代码>
不必是实际文件

笔记
  • 上面的这些都不能用C,但也不能用静态断言,所以我假设将这个问题标记为C是一种疏忽。正如@mafso在一篇评论中指出的,C11确实有一个
    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