2012-11-16 32 views
0

這個想法是創建一個自動腳輪,它可以根據給定的前綴和數字粘貼指向變量的指針。假設你有一些不斷髮展的界面,所以你每隔幾周就會得到一些新的結構版本。所以,而不是寫明確性「(structure1 *),(structure2 *)」等等,你可以使用SOME_DEFINE(thisStructure,版本);這將處理的情況下如何在C預處理器中合併符號名稱和符號值

我認爲這會做的伎倆

#define d1(x) x 
#define d2(x,y) x##y 

void someFunction() 
{ 
    int temp = 3; 
    d2(myStructure,d1(temp)) *thisStruct; 
} 

我希望預處理將鳥巢本身和粘貼操作D1先合併與第一D2參數D1操作的結果。然而它不起作用,所以我的問題是,我怎麼能實現這個事業似乎是可能的。

+0

這個問題還不清楚。你能舉例說明你真正想要的嗎?也許你可以消除預處理器的需要。 – iammilind

+0

@ user1079475,爲什麼你需要d1預處理器? – Anon

+0

@Anon:顯然這是一個人爲的例子。 –

回答

2
#define d2(x,y) x ## y 

void someFunction() 
{ 
    int temp = 3; 
    d2(myStructure,temp) *thisStruct; 
} 

預處理程序將其轉換爲:

void someFunction() 
{ 
    int temp = 3; 
    myStructuretemp *thisStruct; 
} 

如果您要更換的「3」在那裏等你拿myStructure3,那麼你不能做到這一點與預處理 - 它不知道任何有關C/C++變量或其值的信息。

5

我不確定你想要做什麼,但是通常的問題 這裏是預處理器在其參數中進行宏替換之前進行標記粘貼和字符串處理 。所以,如果你寫 類似:

#define PASTE(a,b) a ## b 

,並稱之爲:

#define x 123 
PASTE(A,x) 

,最後一行擴展到Ax,而不是A123。爲了獲得所需的 結果,往往需要添加間接的層次:

#define PASTEHELPER(a,b) a ## b 
#define PASTE(a,b) PASTEHELPER(a,b) 

這工作,因爲之前PASTEHELPER擴展的參數PASTE全宏擴展將 發生,所以在PASTE(A,x),上述, 參數PASTEHELPER將是A123

+0

+1 Correctamundo –

+0

這是OP目前正在做什麼的解釋;不是答案。這個問題本身並不明確。 – iammilind

+0

感謝您的反饋。然而,它不會工作,因爲它只是將值b的名稱傳遞給PASTEHELPER併合並兩個名稱而不是一個名稱和一個值。 – user1079475