2012-02-22 6 views
0

これはばかげているかもしれませんが、マクロの置換順序を忘れてしまったようです。誰かが2つのマクロの値を正しく入れ替える方法を知る手助けができますか?考えてみましょう以下:マクロの値の入れ替え

#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で置換されるvar1を持っているとvar2は5で、この混乱を解決する方法の任意のアイデアを交換するのですか?

私はこの他の質問のために何かを把握しようとするためにこれを使用しようとしている:

C Macro to protect definitions

+0

これは不必要に複雑で壊れやすいようです。あなたがしようとしていることをやり遂げる別の方法がありますか? –

+7

マクロがどのように機能しているのか、あなたは理解できないと思います。彼らは価値がありません。マクロは、コンパイルの前に、ある文字列を別のものに置き換えるだけです(基本的なもの)。とにかく、あなたのコード上でプリプロセッサを実行し、中間出力を見てください(これにはコンパイラオプションがありますが、どのコンパイラを使用していますか?)。これにより、問題の原因が明らかになります。 –

+0

@jeffamaphone、私はgccを使用しています、どうすれば中間出力を見ることができますか?私はstringificationなどの例でこれをテストしたいと思います:http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification – jmlopez

答えて

2

を行うことはできません。
@jeffamaphoneは彼のコメントで説明しているように、マクロ定義は代入ではありません。
#define A Bは、Bの値を気にしません。 ABに置き換えてください。その後、Aがソースに表示されると、それはBに置き換えられ、その後、その時点であると定義されたBで置き換えられます。

関連する問題