2016-12-03 11 views
0

У меня есть постоянная таблицы перекодировкиИнициализация постоянная от постоянной справочной таблицы

static const uint32_t lut [] = {0, 20, 100, 350, 560}; 

У меня есть на структуру

typedef struct { 
    uint32_t value; 
    const char * name; 
} strct_t; 

И я хотел бы создать глобального постоянного экземпляра этой структуры

const struct_t def_myname = { 
    .value = lut[DEF_MYNAME_ID], 
    .name = "myname", 
}; 

но я должен указать DEF_MYNAME_ID в другом месте, так что у меня есть это в какой-то файл заголовка

#define DEF_MYNAME_ID 3 

Это не может компилировать, из-за этой ошибки initializer element is not constant

Есть несколько вопросов в StackOverflow просят, что делать с initializer element is not constant, но ни один покрывает мои потребности.

Есть ли способ, как это сделать? Например, определяя lut как макрос? Мне это не нужно в другом месте.

Есть ли что-то вроде

#define LUT(a) ... 

usabele константным инициализаторе?

ответ

1

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

Сначала определим наш словарь

#define _val0 0 
#define _val1 20 
#define _val2 100 
#define _val3 350 
#define _val4 560 

Теперь нам нужно PRIMITIVE_CAT форсировать расширение аргумента макроса LUT.

#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ 

И окончательный, LUT.

#define LUT(X) PRIMITIVE_CAT(_val, X) 

Теперь ваш код.

#define DEF_MYNAME_ID 3 
const struct_t def_myname = { 
    .value = LUT(DEF_MYNAME_ID), 
    .name = "myname", 
}; 
+0

Хорошее решение, спасибо! – j123b567

0

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

int v = ((uint32_t[]) { 10, 20, 30, 40, 50 })[3]; 

FWIW, это было бы хорошо:

static const uint32_t *pv = lut + DEF_MYNAME_ID; 

, как бы это (по существу, то же самое):

static const uint32_t *pv = &(lut[DEF_MYNAME_ID]); 

Кроме того, в C++, все ваше дело будет в порядке, как указано.