Не могу инициализировать статический массив с тем, что, как я думаю, должно быть константой времени компиляции - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь инициализировать статический массив с размером, основанным на том, что, по моему мнению, должно быть константой времени компиляции.

Это легко исправить, но просто без использования статического, но я не ожидалэта проблема, чтобы показать на всех.Это может вызвать у меня другие проблемы в будущем.

Соответствующие разделы:

typedef struct {
    GPIO_TypeDef* Port;
    uint16_t Pin;
} PortPin;

typedef struct {
    I2C_HandleTypeDef *Handle;
    uint16_t Address;
    PortPin Interrupt;
    PortPin Shutdown;
} VL53L1_Dev_t;

//This one is bigger but I've kept it short to keep it readable. It's 3 elements in my code
static VL53L1_Dev_t Sensors[] = {
    {//1
            &hi2c2,
            0x52,
            {
                    GPIOA,
                    GPIO_PIN_11
            },
            {
                    GPIOA,
                    GPIO_PIN_10
            }
    }
}
static const int sensorCount = sizeof(Sensors)/sizeof(Sensors[0]);
static uint8_t encodedData[sensorCount * 2];//Compiler doesn't like this part

Поскольку датчики полностью определены во время компиляции, я ожидал, что sensorCount также будет постоянной времени компиляции,Что, очевидно, не потому, что я не могу использовать его для объявления и инициализации статических массивов.Я не понимаю почему.

1 Ответ

0 голосов
/ 07 февраля 2019

Размер массива, объявленного в области видимости файла, должен быть целочисленным константным выражением .Это определено в разделе 6.6p6 C стандарта :

Целочисленное константное выражение должно иметь целочисленный тип и иметь только те операнды, которые являются целочисленными константами., константы перечисления, символьные константы, sizeof выражения, результатом которых являются целочисленные константы, _Alignof выражения и плавающие константы, которые являются непосредственными операндами приведений.Операторы приведения в выражении целочисленной константы должны преобразовывать только арифметические типы в целочисленные типы, за исключением случаев, когда они являются частью операнда для оператора sizeof или _Alignof.если объявлено const, не является частью такого выражения.

Если вы определите sensorCount как макрос, выражение sizeof(Sensors)/sizeof(Sensors[0]) будет постоянной времени компиляции.

#define SENSOR_COUNT  (sizeof(Sensors)/sizeof(Sensors[0]))
static uint8_t encodedData[SENSOR_COUNT * 2];
...