我试图找到一种方法将未知固定大小的全局数组的所有元素初始化为非零值(0xffffffff)。
如果 array 具有固定的已知大小,这不会有问题,因为我可以强制将每个元素的初始化强制为0xffffffff,如下所示:
static unsigned int array [4] = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff};
不幸的是,我正在处理未知固定大小的数组。在下面的示例中, SOME_CFG_OPTION 是在构建时定义的。
#define ARRAY_SIZE ROUND_UP(SOME_CFG_OPTION);
static unsigned int array [ARRAY_SIZE]; /* array in BSS and elements init'd to 0 */
一个明显的答案是在构造函数或很早调用的函数中初始化 array 。在我们的设置中,这不是一个选项,因为它对我们的启动时间有太大的影响。
当我们使用GNU或Intel C编译器构建时,以下效果很好。
#define ARRAY_SIZE ROUND_UP(SOME_CFG_OPTION);
static unsigned int array [ARRAY_SIZE]
= { [0 ... (ARRAY_SIZE- 1)] = 0xffffffff };
但是,当我们使用DIAB C编译器(我们也必须支持)尝试此操作时,它会对该方法进行barfs,并出现以下错误
line #: error (etoa:4029): expected an expression
= { [0 ... (ARRAY_SIZE - 1)] = 0xffffffff };
^
有关在使用DIAB C编译器进行编译时如何解决此问题的任何建议?
答案 0 :(得分:0)
Diab的语法分析器不能很好地解析“...”。我大约一年前碰到了这个问题,我找到的唯一解决方案是使用memset。
我这样做的方法是将所有内容设置为0.然后我定义了一个宏:
#define USE_MEM(x) ~x;
我正在处理位操作,所以这很好用。我不会在bootcode中执行此操作,但反向具有很大的影响。在这种情况下,弄清楚数据首次使用的位置并手动应用初始值可能更便宜,例如:在首次使用该值之前添加mem = 0xffffffff。
我使用的是diab 5.2.1.0