+-
[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。在需要在编译时定义一个需要存储其大小的数组的情况下,最佳实践是什么?我猜可能是保留该位置并在运行时设置它的选项,在我看来,这可以工作,但也可能阻止将其保存在只读存储器中。

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

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