5

異なるライブラリに同じ名前を持つさまざまなプリプロセッサ変数があります。

競合を避けるために、私がやっていることは次のとおりです(例では、競合する変数が1つと、簡単にするために含めるヘッダーが1つだけあります):

#ifdef VAR
#define TEMPVAR VAR
#undef VAR
#endif   

#include "conflictingheader.hh" 

#ifdef VAR
#undef VAR
#endif

#ifdef TEMPVAR
#define VAR TEMPVAR
#undef TEMPVAR
#endif

競合するすべての変数を自動的に保存し、それらを未定義にして後で復元する方法はありますか?

または、これらの一連の操作を実行するマクロを定義することは可能ですか?

4

2 に答える 2

8

C++ 言語には、プリプロセッサ マクロの保存と復元を処理する自動化された方法がありません。プリプロセッサ マクロ (コンパイラまたはコンパイラのコマンド ラインから定義されていない) は、ファイル グローバル レベルで動作し、マクロのスコープを特定のヘッダーに制限するという概念はありません#include

このような問題に対処する方法は、その特定のライブラリから必要な機能へのインターフェイス ラッパーを提供する新しいヘッダー ファイルを作成することですが、マクロの依存関係はありません。次に、その厄介なヘッダー ファイルのみを含むソース ファイルにラッパーを実装します。


コンパイラは、タスクを少し冗長にするための拡張機能を提供する場合がありますが、私が理解しているように完全に自動化されているわけではありません。

GCC および Microsoft コンパイラは、プッシュおよびポップ マクロ プラグマをサポートしています。

Microsoft Windows コンパイラとの互換性のために、GCC は#pragma push_macro("macro_name")および#pragma pop_macro("macro_name").

#pragma push_macro("macro_name")
このプラグマは、as という名前のマクロの値を、macro_nameこのマクロのスタックの一番上に保存します。

#pragma pop_macro("macro_name")
このプラグマは、as という名前のマクロの値を、macro_nameこのマクロのスタックの一番上の値に設定します。のスタックmacro_nameが空の場合、マクロの値は変更されません。

GCC ドキュメント

于 2015-05-15T18:27:10.623 に答える
0

それを行う標準的な方法はありません。@jxh には、非標準的な優れた方法があります。これが機能しない理由は、マクロが展開されるまでまったく評価されず、別のマクロ定義で使用されたときに評価されないためです。

#define MY_MACRO  VAR

#define MY_STR_MACRO2(M) # M
#define MY_STR_MACRO(M) "MY_MACRO = " MY_STR_MACRO2(M) "\n"

    printf(MY_STR_MACRO(MY_MACRO));  //writes "VAR"

#define VAR 4
    printf(MY_STR_MACRO(MY_MACRO)); //writes "4"

#undef VAR
    printf(MY_STR_MACRO(MY_MACRO));  //writes "VAR" again

各行printfで、MY_MACROそれが「VAR」であることを確認して確認VARし、何かに定義されているかどうかを確認します。そうである場合もあれば、そうでない場合もあります。

したがって、これを試すと:

#define TEMPVAR VAR

キャプチャされる唯一のものTEMPVARは「VAR」です。VAR評価される可能性のあるものは、この時点では考慮されず、評価する必要があるまで考慮されませんTEMPVAR

于 2015-05-15T20:05:51.917 に答える