2012-02-22 78 views
0

這可能看起來很愚蠢,但我似乎忘記了宏的替換順序。有人能幫我弄清楚如何正確交換兩個宏的值嗎?考慮以下幾點:交換宏的值

#include <stdlib.h> 
#include <stdio.h> 

#define var1 5 
#define var2 10 

#define _VAL(a) a 
#define VAL(a) _VAL(a) 


int main(){ 

    printf("var1 = %d, var2 = %d\n", var1, var2); 

#define TEMP VAL(var1) 
#undef var1 
#define var1 VAL(var2) 
#undef var2 
#define var2 VAL(TEMP) 

    printf("var1 = %d, var2 = %d\n", var1, var2); 
} 

所有我想要的是擁有10所取代var1var2由5所取代的如何解決這個爛攤子任何想法?

我想用這個來揣摩出來的東西該另一個問題:

C Macro to protect definitions

+0

這似乎不必要的複雜和脆弱。有沒有其他方法可以做你想做的事情? – 2012-02-22 21:14:33

+7

我不認爲你明白宏是如何工作的。他們沒有價值。宏在編譯之前只需將一個文本字符串替換爲另一個文本字符串(以及基本字符串)。無論如何,在您的代碼上運行預處理器並查看中間輸出(這裏有一個編譯器選項;您使用的是什麼編譯器?)。這將闡明你的問題的根源。 – 2012-02-22 21:15:36

+0

@jeffamaphone,我正在使用gcc,我怎樣才能看到中間輸出。我想測試一下這樣的例子,如字符串化:http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification – jmlopez 2012-02-22 23:05:03

回答

2

不能完成。
正如@jeffamaphone在他的評論中解釋的那樣,宏觀定義不是分配。
#define A B不關心B的值。它只是記得A應該被替換爲B。之後,當在源中看到A時,它將被替換爲B,然後可以再次替換它,而當時定義爲B