是否有可能在GCC / GNU C中编写_Static_assert来在编译时验证内存中位字段的布局?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有可能在GCC / GNU C中编写_Static_assert来在编译时验证内存中位字段的布局?相关的知识,希望对你有一定的参考价值。
假设我具有以下定义:
#include <stdbool.h>
#include <stdint.h>
#define ASSERT(cond) _Static_assert(cond, #cond)
typedef union {
struct {
bool bit0:1;
bool bit1:1;
bool bit2:1;
bool bit3:1;
bool bit4:1;
bool bit5:1;
bool bit6:1;
bool bit7:1;
};
uint8_t bits;
} byte;
ASSERT(sizeof(byte) == sizeof(uint8_t));
是否可以编写代码,例如
#include <assert.h>
// ...
assert(((byte) { .bit0 = 1 }).bits == 0b00000001);
assert(((byte) { .bit1 = 1 }).bits == 0b00000010);
assert(((byte) { .bit2 = 1 }).bits == 0b00000100);
assert(((byte) { .bit3 = 1 }).bits == 0b00001000);
assert(((byte) { .bit4 = 1 }).bits == 0b00010000);
assert(((byte) { .bit5 = 1 }).bits == 0b00100000);
assert(((byte) { .bit6 = 1 }).bits == 0b01000000);
assert(((byte) { .bit7 = 1 }).bits == 0b10000000);
// ...
如果不满足上述条件,将会导致编译时失败?
((当我尝试将条件放置在ASSERT
宏中时,编译器会抱怨expression in static assertion is not constant
,这当然是很合理的)]
允许该解决方案使用C语言的GNU扩展。
答案
我认为您不能。需要_Static_assert
来验证参数表达式满足整数常量表达式的标准C要求。
以上是关于是否有可能在GCC / GNU C中编写_Static_assert来在编译时验证内存中位字段的布局?的主要内容,如果未能解决你的问题,请参考以下文章
error: command ‘x86_64-linux-gnu-gcc‘ failed
“错误:命令'x86_64-linux-gnu-gcc'失败,退出状态为1”在virtualenv中
如何找出 Linux 上的 GNU C++ 中剩余的可用内存量
致命错误:Python.h:没有这样的文件或目录错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1