Мне нужно найти решение для создания массива и выполнить назначенную инициализацию массива во время объявления.
Следующий код работает под C-компилятором ARM11, но, как всегда, он не работаетпод компилятором MSVC.Я пытаюсь создать модульный тест под Win32 для тестирования встроенного программного обеспечения перед его доставкой клиентам.
Код выглядит следующим образом:
/* In some header file: */
...
/* Module1 */
#define P_proc1 0
/* Module2 */
#define P_proc2 ( P_proc1 + 1 )
#define P_proc3 ( P_proc2 + 1 )
#define P_proc4 ( P_proc3 + 1 )
/* Module3 */
#define P_proc5 ( P_proc4 + 1 )
#define P_proc6 ( P_proc5 + 1 )
#define P_proc7 ( P_proc6 + 1 )
#define Q_proc2_2nd_inst ( P_proc7 + 1 )
#define Q_proc3_2nd_inst ( Q_proc2_2nd_inst + 1 )
#define Q_proc5_2nd_inst ( Q_proc3_2nd_inst + 1 )
#define P_Last ( Q_proc5_2nd_inst + 1 )
...
/* End of some header file */
И
/* The source file */
#include "some header file"
...
/* MACRO declarations */
/* For the following macro: PROC = base process name,
INSTANCE = base number of instance
GROUP = extended num of instances for this instance*/
#define PQ_ENTRY(PROC, INSTANCE, GROUP ) \
[P_##PROC + INST - 1] = { queue_table + P_##PROC + INSTANCE - 1, \
queue_table + ( GROUP == 1 ? \
P_##PROC : \
Q_##PROC##_2nd_inst ) \
+ INST - 1 }
/* GLOBAL VARIABLE declarations */
/* queue definitions for tasks */
t_queue queue_table[P_last + 1];
t_queue *const p_queue_table[][2] =
{
PQ_ENTRY( proc3, 1, 2 ),
PQ_ENTRY( proc2, 1, 2 ),
PQ_ENTRY( proc7, 1, 1 ),
PQ_ENTRY( proc5, 1, 2 ),
PQ_ENTRY( proc6, 1, 1 ),
PQ_ENTRY( proc1, 1, 1 ),
PQ_ENTRY( proc4, 1, 1 )
};
...
/* End of source file */
Определения для P_proc * также являются индексом таблицы (массива) queue_table.В этом примере имена процессов (базовых) были упрощены всего несколькими процессами, но для реального кода процессов намного больше, и (базовые) имена могут быть любыми.
Идея p_queue_table состоит в том, чтоиметь таблицу, которая будет содержать указатели на queue_table для разных экземпляров процесса и которая имеет индекс, да, имя процесса def., P_procX.
Невозможно полагаться на порядокзаписей в p_queue_table в том же порядке, что и имена процессов P_XXX.Если бы это было так, то мне не понадобилась бы назначенная инициализация таблицы.Одним из решений было бы просто объявить массив p_queue_table, а затем инициализировать его позже в функции, но это не то, что нужно.
Должна быть возможность расширять / создавать макросы для инициализации таблицыпри создании таблицы, даже если нужно создать другую таблицу, которую можно затем отсортировать и использовать для инициализации p_queue_table, за исключением procs [] [3], который инициализируется с помощью {{proc3, 1, 2}, {proc2,1, 2}, ...}.
У кого-нибудь есть ответ на эту проблему?