0

我有,我傳遞一個參數,並使用該定義基於輸入名稱的新變量宏:在宏變量中替換字符串?

#define DO_X(x) char _do_x_var_ ## x; /* other things */ 

問題是如果我通過在結構體變量,它打破:

DO_X(some_struct->thing) 

變爲:

char _do_x_var_some_struct->thing; /* other things */ 

編輯:我想它,以評估什麼是:

char _do_x_var_some_struct__thing; /* other things */ 

(或含有類似輸入的東西任何有效的變量名)

我真正想要的是這些工作:

#define DO_X(x) for(char _do_x_var_ ## x; /*things*/) 
DO_X(x){ 
    DO_X(y) { 
     /*things*/ 
    } 
} 

DO_X(object->x){ 
    DO_X(object->y) { 
     /*things*/ 
    } 
} 

但對於這些失敗:

#define DO_X(x) for(char _do_x_var_ ## x; /*things*/) 
DO_X(x){ 
    DO_X(x) { // <-- multiple definition of _do_x_var_x 
     /*things*/ 
    } 
} 

DO_X(object->x){ 
    DO_X(object->x) { // <-- multiple definition of _do_x_var_object__x (or whatever) 
     /*things*/ 
    } 
} 

有什麼方法可以使這項工作?也許用__替代->什麼的?我找到了連接方法,但不能替換字符串..

+0

你能澄清你想讓宏給你什麼嗎? – 2010-10-27 22:17:24

+0

1.您是否試圖在其外部聲明一個類變量? 2.這是宏的死亡。 – 2010-10-27 22:20:46

+0

@奧利查爾斯沃斯:我補充說明我想要的東西 – 2010-10-27 22:32:22

回答

4

您還沒有找到重寫任意字符串的方法,因爲宏不能這樣做。宏名稱必須是有效的標識符,其中->不是。 C預處理器的功能非常有限。你可以看看m4是否有更強大的預處理器,但你可能會走錯路。

2

我不知道任何預處理器機制將struct-> element參數視爲兩個單獨的標記或將 - >自動轉換爲下劃線。我的建議是有一個單獨的宏,例如DO_X2(struct_ptr,element),它會在需要時添加「 - >」或「_」。然後,您可以根據需要使用DO_X或DO_X2。

如果您打算按照指示使用這些宏,則存在單獨的問題。內部for循環可以聲明完全相同的變量名稱,因爲它們具有不同的範圍,所以它不會被視爲錯誤。例如,假設你的C編譯器支持聲明中的迭代器這樣的語句(我不相信是C標準行爲):

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

那麼你可以做以下的,它不會被認爲是一個錯誤:

int sum = 0; 
for (int i=0; i<10; ++i) 
    for (int i=0; i<10; ++i) 
     ++sum; 

兩個「我我」有不同的範圍,所以它應該編譯和執行得很好。