24

マクロを一時的に上書きしてから復元する必要があります。お気に入り:

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

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

追加。実例について。エラー例外にはグローバル マクロを使用します。のように動作assertしますが、デバッグ バージョンだけでなく、永続的な使用のために使用されます。そのため、たとえば、通常はマクロ内で (副作用を伴う) 関数を呼び出します。一度定義されますが、定義は永続的ではありません。したがって、私はそれをアプリオリに知りません。一部のコードでは、独自の修正版のマクロが必要ですが、コードの一般的なスタイルを保存したいと考えています。コードの一部で 1 つのマクロを使用し、別の部分で別のマクロを使用すると、見栄えが悪くなります。両方のマクロの目的は同じですが、実装がわずかに異なります。

そのため、元のマクロを一時的に保存し、コードの一部に別のバージョンを使用してから、元のマクロを復元するのがよいでしょう。

4

3 に答える 3

9

すでに述べたように、それは実際には不可能です。状況によっては、これは回避策になる場合があります。

#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、少なくとも一時的に上書きする可能性のある定義に対して、次のようなパターンを使用する必要があります。

#ifndef macro1
#define macro1 "original value"
#endif
于 2013-01-10T19:08:19.477 に答える
1

Cに最も近いのは#undefディレクティブです。これは単にマクロの定義を解除し、マクロを置き換えることができるようにします。

#define FOO X

...

#undef FOO
#define FOO Y

...

#undef FOO
#define FOO X

FOO問題は、一度再定義するとの「古い」値を知ることができないことです。そのため、値を1か所にハードコーディングする必要があります。

標準Cで他のプリプロセッサディレクティブを作成するマクロを作成することはできないため、値を保存するためのマクロを作成することもできません。

于 2013-01-10T15:44:09.427 に答える