我需要找到一个解决方案来创建一个数组,并在声明期间对数组进行指定的初始化。
以下代码在ARM11 C编译器下运行,但是,与往常一样,它在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,ex的procs [] [3]用{{proc3,1,2},{proc2,1,2},...}初始化。
有没有人能解决这个问题?
答案 0 :(得分:1)
您正在使用指定的初始化程序功能
double A[10] = { [1] = 32.0, [5] = 43.0 };
表示数组元素。此功能由C99引入,C99是12年以来的有效标准。 AFAIK MSVC不支持C99,只支持C89。