2017-04-18 18 views
0

私はこれに似たものを見つけることができません。変数に整数に関連付けられたマクロIDの名前を出力します。

#define ONE 1 
#define TWO 2 

int main() 
{ 
    int x = ONE; 
    printf("%s \n", x); 
} 
//the desirable output will be "ONE" 

今、私は

#define PRINT(X) printf("%s \n", #x); 

と他の回答を見て、私は私が欲しいものを得るためにそれを使用する方法を見つけることができませんでした。

+1

1を1に定義していませんか?ですから、x = ONEと言うことができます。あなたが今やっていることと同じでしょうか? – matt

+1

あなたは何をしたいですか? 'printf'のドキュメントを読むのはどうですか?それが助けにならない場合は、言語の基礎のいくつかを忘れているかもしれません。上のコードは、未定義の動作を呼び出します.iow:有効ではありません。 – Olaf

+1

'//例外は" ONE "と出力されます。これは本当ですか?それを試しましたか? – Karthick

答えて

0

@KeithThompsonは言ったように、簡単な方法はありません。

しかし、あなたが求めるものは多かれ少なかれclever hackです。

#define MY_ENUM_LIST \ 
    X(ONE , 1) \ 
    X(TWO , 2) \ 
    X(THREE , 3) 

#define X(name, value) name = value, 
enum MyEnum {MY_ENUM_LIST}; 
#undef X 

const char *my_enum_to_str(enum MyEnum e) 
{ 
    switch (e) 
    { 
     #define X(name, value) case value: return #name; 
     MY_ENUM_LIST 
     #undef X 
     default: 
     return "<invalid>"; 
    } 
} 

int main() 
{ 
    int x = ONE; 
    printf("%d\n", x); // prints "1" 
    printf("%s\n", my_enum_to_str(x)); // prints "ONE" 

    return 0; 
} 

それはナイーブルックアップテーブルの上に以下の利点をしています

  • 二回列挙子の名前を繰り返す必要がありませんが。
  • 連続した範囲だけでなく、任意の列挙値を持つことができます。
  • 誤って列挙子に間違った名前を割り当てることはできません。
+0

完璧!ありがとうございました!!!!!!! –

+0

これはひどいアプローチです。 – Olaf

+0

@Olaf詳しく教えてください。 「ひどいアプローチ」は建設的ではないと言っている。 AFAIKこれは最高の既存ソリューションです。唯一の選択肢は単純なルックアップテーブル(列挙子名を重複させ、しばしばバグにつながる)であり、実行時に列挙子の値を名前で調べるのは明らかです。このアプローチの唯一の欠点は、構文がかなりエキゾチックであることです。 – HolyBlackCat

5

これを行う直接的な方法はありません。 printfの呼び出しで得られる唯一の情報は、ONEのマクロを展開したときの、現在の値が(実行時の)1になる変数xです。コンパイラがその情報から名前ONEを見つける方法はありません。同じ定義のマクロがいくつかあるかもしれませんし、存在しないかもしれません。

文字列ONEの整数値が1の場合、何らかのルックアップテーブルまたは関数を設定する必要があります。たとえば:

const char *const names[] = { "ZERO", "ONE", "TWO", "THREE", "FOUR", /* etc. */ }; 
printf("%s\n", names[x]); 

それはたとえば1ため"THREE"にマップされないように、右の名前を取得するには、完全にあなた次第でしょう。

+0

ありがとう、素晴らしい解決策!しかし、それは私が一生懸命働くように呼びます。 @HolyBlackCatの答えは私の方がいいです。ありがとうございました! –

+2

私は配列 'const'を作るでしょう。 – Olaf

+0

@Olaf:良い点、完了。 –

関連する問題