我有一个宏来重复我用来在编译时使用默认值填充数组的宏:
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。因此,在将其连接到其他宏之前,是否有办法将这些值扩展为最终的数值?
您可以MACRO_REPEAT(ARRAY_LENGTH , -2)
通过更改定义MACRO_REPEAT
以使用2级扩展来解决这种情况,即,不使用令牌粘贴MACRO_REPEAT
本身,而是调用另一个宏。
并非只有ARRAY_LENGTH
在定义为单个数字令牌并且存在针对此特定大小的宏定义的情况下,此方法才能按预期工作。
您不能MACRO_REPEAT(X*Y , -2)
使用标准C预处理器来处理更一般的情况。
您可以使用gcc扩展名来初始化简单数组:
#define MACRO_REPEAT(n, e) [ 0 ... (n)-1 ] = (e),
但是此方法不能用于处理诸如的多维数组MACRO_REPEAT(X*Y , -2)
。
您可以尝试以下方法:
#define MACRO_REPEAT(n, e) [ 0 ... (n)-1 ] = (e),
#define X 512
#define Y 512
const int array[X][Y] = { MACRO_REPEAT(X, { MACRO_REPEAT(Y, -2) }) };
但是使用C预处理器只会混淆意图。如果您决定依赖gcc扩展名,请直接使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句