是否有可能在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

Linux gcc编译问题

gcc:查找 libstdc++ 的目录

“错误:命令'x86_64-linux-gnu-gcc'失败,退出状态为1”在virtualenv中

如何找出 Linux 上的 GNU C++ 中剩余的可用内存量

致命错误:Python.h:没有这样的文件或目录错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1