Проверить массив в препроцессоре C (функциональная ошибка компиляции макроса) - PullRequest
0 голосов
/ 27 мая 2020

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

В любом случае, в настоящее время я не могу получить что-то, что даже компилируется, не говоря уже о том, чтобы работать и не слишком шифрованно c.

Я свел это к следующему в качестве примера:

typedef struct int_struct
{
    int number;
} int_struct;

#define NUMBER_OF_VALUES
int_struct numbers[NUMBER_OF_VALUES] = 
{
    {.number = 0}, //Good, matches index
    {.number = 1}, //Good, matches index
    {.number = 4}  //Bad, doesn't match index
};


//Run static assert to make sure array is indexed using the correct state enum
#define _check_number_array() { \
    for (int i=0; i< NUMBER_OF_VALUES; i++) 
        _static_assert(i == numbers[i].number); \
}

static const uint8_t _array_is_valid_ = _check_number_array(); //Actually run our static check

Компилятор: ошибка: ожидаемое выражение перед 'for'

Не могли бы вы помочь мне исправить эту ошибку или предложить как проверить инициализацию массива с каким-то условием?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...