【发布时间】:2017-06-14 20:29:22
【问题描述】:
我想声明一个包含灵活数组成员的结构,然后在上面使用sizeof()。原型是:
typedef struct
{
uint16_t length;
uint8_t array[][2];
} FLEXIBLE_t;
然后我声明它:
const FLEXIBLE_t test = {
.length = sizeof(test),
.array = { { 0, 1 },
{ 2, 3 },
{ 4, 5 },
{ 6, 7 },
{ 8, 9 } }
};
一切都可以编译(GCC),但是当我检查 test.length 时,它的值为 2,即它只计算 length 本身的 uint16_t。
如何在编译时计算结构体的大小?看来编译器使用的是原型而不是具体实例。
【问题讨论】:
-
啊,等等,标准的 6.7.2.18 似乎暗示这个声明是无效的,即使编译器接受它。
-
查看 .map 文件,似乎 GCC 已为结构分配了正确的空间量并按照我的预期填充了它。
-
如果你在运行时计算,什么是 sizeof 测试?
-
请注意,如果在没有
static限定符的函数内部定义了test(const不重要),则 GCC 不允许初始化具有灵活数组成员的结构( FAM)。如果变量具有文件范围或标记为static,则作为扩展的 GCC 允许初始化。 -
@Vagish,sizeof 是一个编译时间常数。
标签: c arrays struct sizeof flexible-array-member