第 32 週のC++ Guru (プリプロセッサ マクロの「正当な」使用について話す) の最後の例は、DERR_ENTRY
実際の実装なしで呼び出されたマクロを示しています。
DERR_ENTRY および関連するマクロの実装は、読者に任されています。
このマクロはこれを置き換えることになっています:
// For outsiders:
enum Errors {
ERR_OK = 0, // No error
ERR_INVALID_PARAM = 1 // <description>
...
}
// For the module's internal use:
map<Error,const char*> lookup;
lookup.insert( make_pair( Error(0), "No error" ) );
lookup.insert( make_pair( Error(1), "<description>" ) );
これで:(はるかに簡単)
DERR_ENTRY( ERR_OK, 0, "No error" ),
DERR_ENTRY( ERR_INVALID_PARAM, 1, "<description>" ),
//...
GotWの著者によると:
実際の情報 (コード/メッセージのペア) を 2 回定義せずに、両方の表現を使用したいと考えています。マクロ マジックを使用すると、次のようにエラーのリストを簡単に記述でき、コンパイル時に適切な構造を作成できます。
しかし、列挙型エントリとマップ エントリの両方を同時に定義する簡単な方法がわかりません。それとも、これを解決できるかわからない未知の構文があるのでしょうか?
では、DERR_ENTRY マクロをどのように実装しますか?
注 : GotW #32 は、プリプロセッサ マクロの能力を示すことになっていることに注意してください。