2012-02-22 62 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