2015-07-19 57 views
1

我有一個陣列的10個元素。將在該元素上調用任意函數C宏在一個範圍內運行循環

每個任意的功能可以

  1. 操作單個元件上,或者
  2. 相同的功能將在所有元素進行操作。

我有各種功能遵循這種模式。

我試圖做到這一點:

#define ITERATE_ALL10(IDX) (##IDX = 0; ##IDX < 10; ##IDX++) 

int arbitrary_fx(int *some_arr, int id) { 
    int i; 

    if (id == ID_ALL) { 
     for (ITERATE_ALL10(i)) { 
      arbitrary_fx_helper(some_arr[id]); 
     } 
    } 
    else { 
     arbitrary_fx_helper(some_arr[id]); 
    } 
} 

我無法弄清楚如何修復錯誤:

expected ';' before ')' token 

expected expression before ')' token 

我做了什麼錯誤?有沒有更好的方法來實現我想要的?

+2

爲什麼使用令牌粘貼操作符?這不是必需的。 – fuz

+2

從宏定義中刪除括號或從宏調用周圍刪除括號。 –

+0

你想要'#define ITERATE_ALL10(IDX)IDX = 0; IDX <10; IDX ++'? – BLUEPIXY

回答

5

你的代碼有兩個錯誤。

首先,您錯誤地使用令牌粘貼運算符##。該運算符用於粘貼兩個令牌以創建新令牌,例如foo ## bar收率爲foobar。你不需要它,只需放下它。

修復此問題後,您的宏是這樣的:

#define ITERATE_ALL10(IDX) (IDX = 0; IDX < 10; IDX++) 

這是擴張的樣子:

for ((i = 0; i < 10; i++)) { 

注意到有一對冗餘括號,這是什麼引發關閉編譯器。無論是從宏定義刪除括號:

#define ITERATE_ALL10(IDX) IDX = 0; IDX < 10; IDX++ 

或從宏調用刪除括號:

for ITERATE_ALL10(i) 

我更喜歡前者。

+0

我更喜歡'for(i = 0; i <10; i ++){...}'。完全看不到這個宏定義的要點。 –

+0

@squeamishossifrage這個評論應該是「問題」而不是「答案」。 –

+0

@squeamishossifrage我認爲他有很多這些功能,並試圖以某種方式使事情變得更容易,但是失敗了。 –

0

從宏定義中刪除括號或從宏調用周圍刪除括號。您還需要刪除令牌粘貼操作員##,因爲您沒有要粘貼的兩個令牌。

或者:

#define ITERATE_ALL10(IDX) IDX = 0; IDX < 10; IDX++ 

for (ITERATE_ALL10(i)) { 

或者:

#define ITERATE_ALL10(IDX) (IDX = 0; IDX < 10; IDX++) 

for ITERATE_ALL10(i) { 

我並不特別推薦任何一個解決方案,但他們應該工作。您的代碼(修訂來解決與##問題)產生:

for ((i = 0; i < 10; i++)) { 

和雙括號破壞的語法。