首页 > 解决方案 > 隐式大小的数组声明中的 sizeof(array)

问题描述

考虑以下常见的数组定义,注意数组本身必须包含总大小:

#define BUFSZ 3
uint8_t buffer[BUFSZ] = {
    BUFSZ, 0xFF, 0x00
}

当您大量更改缓冲区并且它变得足够大以至于跟踪每个更改比每次从头开始计数更容易时,这不是很方便。当然,这样的事情是可能的:

#define BUFSZ 3
uint8_t buffer[BUFSZ] = {
    sizeof(buffer), 0xFF, 0x00
}

或相反

#define BUFSZ 3
uint8_t buffer[] = {
    BUFSZ, 0xFF, 0x00
}

但是完全不需要计数的两者的组合是不可能的:

uint8_t buffer[] = {
    sizeof(buffer), 0xFF, 0x00
}

这导致
invalid application of 'sizeof' to incomplete type 'uint8_t[]' {aka 'unsigned char[]'}
注意我使用的是 arm-none-eabi-gcc 编译器,但这也适用于 gcc。

对于需要在编译时定义一个需要存储其大小的数组的情况,最佳实践是什么?
我想一个选项可能是保留该位置并在运行时设置它,这在我的情况下可以工作,但也可能阻止它保存在只读内存中。

标签: carraysgccsizeof

解决方案


#define  INIT   0xFF, 0x00
#define  SOF(x) (sizeof((char []){x})+1)

char buffer[] =
{
    SOF(INIT) , INIT
};

或者

#define  SOF(name, ...) char name[] = {(sizeof((char []){__VA_ARGS__})+1), __VA_ARGS__}

SOF(buffer,255,0);

推荐阅读