2013-01-10 7 views
13

マクロを一時的に上書きしてから復元する必要があります。 Like:Cプリプロセッサでマクロを一時的に上書きする

#define FOO X 
#save FOO 
#define FOO Y 
... 
#restore FOO 

標準のCプリプロセッサでは可能ですか? GCCで?

ADDED。実世界の例についてエラー例外のためにグローバルマクロを使用します。 assertのように動作しますが、デバッグバージョンだけでなく永続的な使用のためにも機能します。したがって、たとえば、私は通常、マクロ内で関数を(副作用を伴って)呼び出します。これは一度定義されますが、定義は永続的ではありません。したがって、私は先験的にそれを知らない。いくつかのコードでは、マクロの修正版が必要ですが、はコードの一般的なスタイルを保存します。コードの1つの部分が1つのマクロを使用し、他の部分が他のマクロを使用すると見苦しいです - どちらのマクロも同じ目的のを持っていますが、わずかに異なる実装です。

私は元のマクロを一時的に保存し、その元のマクロを復元した後にコードの一部に異なるバージョンを使用することをお勧めします。

+0

あなたが正確に何 'FOOを知っている場合を除き:

#include "generalmacrodefs.h" // put them in here or include them indirectly #undef macro1 #define macro1 "specialized temporary value" #undef macro1 #include "generalmacrodefs.h" // restores 

これはgeneralmacrodefs.hはあなたが一時的に上書きされる可能性があり、少なくとも定義については、このようなパターンを使用している必要があります。状況に応じて、これは回避策かもしれません'前後です。いいえ、これは不可能です。 –

+2

マクロの名前を変更するだけではどうですか?はるかに簡単です。 –

+1

プレーンCについてはわかりませんが、C++ではpush_macroを使用できます:http://stackoverflow.com/questions/1543736/how-do-i-temporarily-disable-a-macro-expansion-in-cc –

答えて

4

ように、他のプリプロセッサディレクティブを作成するマクロを持ってすることはできませんとしてあなたは、どちらかの値を保存するためのマクロを作成することはできませんすでにそれが本当に可能ではない、と述べました。

#ifndef macro1 
#define macro1 "original value" 
#endif 
1

あなたがCに来ることができる最も近いがそれを交換することができ、簡単にマクロを未定義に#undefディレクティブ、次のとおりです。

#define FOO X 

... 

#undef FOO 
#define FOO Y 

... 

#undef FOO 
#define FOO X 

問題は、かつてFOOの「古い」値を知ることができないということですそれを再定義するので、値を1つの場所にハードコードする必要があります。

標準C.

+0

I 'FOO'の古い値が分からないか、定義が大きすぎるかもしれません。 –

+0

@ user14284あなたは幸運の鉛直です。これにはC言語での解決策はありません。マクロの名前を変更できない特別な理由はありますか? –

+0

おそらくGCCの解決策がありますか?そして「名前を変更する」の意味は? –

関連する問題