質問: としたとき、 "ABC" の方を出力したいのです。 組んだクラスや関数の戻り値を確かめたい( テストする ) 場合、数値を出力してもわかりづらいので。 主な用法は戻り値として返る可能性がある数値データ(int?) を #define 等で定数化し、 関数の処理がうまくいっているかチェックする。です。 たとえば、TEXTマクロ ( Windows API の TEXTマクロ。 ) だとすると ( 使い道が違うと思いますが、例なので。 )、 ``` #define ERROR1_T -1 #define ERROR2_T -2 #define ERROR3_T -3 #define S_OK_T 0 int test( void ){ // ファイルが存在しなかった等 if( .... ) return ERROR1_T; // 処理&戻り値を返す if( .... ){ return ERROR2_T; }else if( .... ){ return ERROR3_T; }else{ return S_OK_T; } } int main( void ){ // 戻り値を 文字列化してわかりやすくする。 cout << TEXT( test() ) << endl; return 0; } ``` みたいな感じです。 vectorやlist等のSTLや配列に、対応する文字列を入れる方法もありますが、 定数が多いとかなり面倒なので。 数列ではなく文字列を定数化 ( #define ERROR1_T "ERROR1" ) 等だと面倒なので。 宜しくお願い致します。
回答: こんにちは。 Windows APIで例えるならば、なんとエラーメッセージが取得出来たのFormatMessage()がBeatStarさんが希望されているものと思います。 > > vectorやlist等のSTLや配列に、対応する文字列を入れる方法もありますが、 定数が多いとかなり面倒なので。 > > > しかし、現実問題、これしかないと思います。 その定義をする際に同じことを何度も書かずに済ませる方法を考えると良いですよ。 clangのソースを読んでいるとあちこちで使ってるテクニックがあります。 例えば、error.incのようなソースに次のように記述します。 ``` DEF_ERROR(ERROR1_T, -1) DEF_ERROR(ERROR2_T, -2) DEF_ERROR(ERROR3_T, -3) DEF_ERROR(S_OK_T, 0) : #undef DEF_ERROR ``` そして、シンボル定義(マクロではなくstatic constなint型で定義)は下記のようにします。 ``` #define DEF_ERROR(dSymbol, dValue) static const int dSymbol=dValue; #include "error.inc" ``` 更にstd::mapに定義するために下記のようにします。 ``` #define DEF_ERROR(dSymbol, dValue) {dValue, #dSymbol}, const std::map ErrorMessage { #include "error.inc" }; ``` 使い方は下記です。 ``` #include #include // 上記のエラー定義 // test()関数定義 int main() { std::cout << ErrorMessage.at(test()) << "\n"; return 0; } ``` msvc 2015とMinGW(gcc) 5.3.0(-std=c++11)で動作しました。