C宏扩展顺序

曲调

我有一个宏来重复我用来在编译时使用默认值填充数组的宏:

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。因此,在将其连接到其他宏之前,是否有办法将这些值扩展为最终的数值?

chqrlie

您可以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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章