【发布时间】:2016-07-15 12:55:10
【问题描述】:
我有一个宏来重复我用来在编译时用默认值填充数组的宏:
const int array [512] =
{
MACRO_REPEAT(512, -2) // this repeats -2, 512 times
[4] = 10,
[5] = 2,
...
}
宏重复将扩展为 MACRO_REPEAT_512,但现在我想使用其他宏作为数组大小,例如:
#define ARRAY_LENGTH 512
const int array [ARRAY_LENGTH ] =
{
MACRO_REPEAT(ARRAY_LENGTH , -2) // this repeats -2, 512 times
[4] = 10,
[5] = 2,
...
}
但这会扩展为 MACRO_REPEAT_ARRAY_LENGTH,在连接之前不会扩展 ARRAY_LENGTH 值。另一个例子是多维数组,它涉及更多级别的扩展:
#define X 512
#define Y 512
const int array [X][Y] =
{
MACRO_REPEAT(X*Y , -2) // this repeats -2, 512 times
[4] = 10,
[5] = 2,
...
}
这将扩展为 MARO_REPEAT_X*Y。那么,有没有办法将这些值扩展为最终的数值,然后再将其连接到其他宏?
【问题讨论】:
-
为什么不简单地使用循环或
memset()?是的,它们在运行时工作,但相对容易达到预期的效果。 -
GCC 有一个扩展,允许您将一系列元素初始化为相同的值,例如
int array[ARRAY_LENGTH] = { [0 ... 3] = -2, [4] = 10, [5] = 2, [6 ... ARRAY_LENGTH - 1] = -2, }; -
@Peter 我知道,但我在嵌入式系统中工作,我想将它存储在闪存中(使用 const 限定符更新问题)
-
@IanAbbott 我不知道那个,即使它不是 ANSI C 我也不介意,GCC 对我来说很好。你能回复那个,这样我就可以把它作为正确的答案?
-
你能用boost preprocessor吗?如果是,那么,例如,BOOST_PP_REPEAT 看起来很有趣。
标签: c macros c-preprocessor