簡體   English   中英

C宏擴展順序

[英]C macro expansion order

我有一個宏來重復我用來在編譯時使用默認值填充數組的宏:

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的定義MACRO_REPEAT為使用2級擴展來解決MACRO_REPEAT(ARRAY_LENGTH , -2)情況,即不要在MACRO_REPEAT本身中使用令牌粘貼, MACRO_REPEAT調用另一個宏。

並非只有在將ARRAY_LENGTH定義為單個數字令牌並且存在針對此特定大小的宏定義的情況下,此方法才能按預期工作。

您不能使用標准C預處理器處理更一般的MACRO_REPEAT(X*Y , -2)情況。

您可以使用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擴展名,則直接使用它們。

我不確定這是否算作“正確”的答案,因為它不能直接回答OP的問題,但這是針對該問題的建議解決方法。 它也不是標准C,因為它使用了GCC擴展。

在GNU C編譯器(gcc)中,可以使用[FIRST ... LAST] = VALUE的形式將一系列數組元素初始化為相同的值。 它似乎還允許一個元素使用多個指定的初始化程序,因此可以將一系列元素初始化為相同的值,然后將該范圍內包含的元素初始化為不同的值,如下所示:

#define ARRAY_LENGTH 512
const int array[ARRAY_LENGTH] =
{
    [0 ... ARRAY_LENGTH - 1] = -2,
    [4] = 10,
    [5] = 2,
    /* ... */
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM