sizeof (массив) в объявлении массива неявного размера - PullRequest
1 голос
/ 30 марта 2020

Рассмотрим следующее общее определение массива, обратите внимание, что сам массив должен включать в себя общий размер:

#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-g cc, но это также относится и к g cc.

Какова наилучшая практика для ситуации, когда вам нужно определить массив во время компиляции, который должен хранить его размер?
Полагаю, можно было бы зарезервировать это место и установить его во время выполнения, что в моем случае могло бы сработать, но также могло бы предотвратить его сохранение в постоянной памяти.

1 Ответ

0 голосов
/ 30 марта 2020
#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);
...