5

私はこのリンクを見ました

Cで列挙名を文字列に変換する方法

enumsクライアント提供のライブラリ ヘッダー ファイル (これは変更できません) で、次のように定義された一連のファイルがあります。

また、列挙型は sparse です。

typedef enum
{
    ERROR_NONE=59,   
    ERROR_A=65,  
    ERROR_B=67
}

たとえば、関数でこれらの値を印刷したいのですが、のERROR_NONE代わりに印刷したいと思います59switch caseこれを行うためにorif elseコンストラクトを使用するより良い方法はありますか? 例

   int Status=0;
   /* some processing in library where Status changes to 59 */
   printf("Status = %d\n",Status); /* want to print ERROR_NONE instead of 59 */
4

2 に答える 2

3

文字列化演算子を直接適用すると役立つ場合があります

#define stringize(x) #x

printf("%s\n", stringize(ERROR_NONE));

ライブラリファイルを変更できないと述べました。別の方法で決定した場合:)、X次のようにマクロを使用できます

enumstring.c
#include <stdio.h>

#define NAMES C(RED)C(GREEN)C(BLUE)

#define C(x) x,

enum color { NAMES TOP };

#undef C

#define C(x) #x,

const char * const color_name[] = { NAMES };

int main( void ) 
{ printf( "The color is %s.\n", color_name[ RED ]);  
  printf( "There are %d colors.\n", TOP ); }

stdout
The color is RED. 
There are 3 colors.

詳細はこちら

編集:あなたが私たちに示している特定の例でswitch-caseは、特に sparse がある場合、あなたが得ることができる最も近いものですenums

于 2012-05-07T10:30:21.353 に答える
2

FAQ11.17xstr()マクロを使用します。あなたはおそらくそれを使うべきです:

 #define str(x) #x
 #define xstr(x) str(x)

 printf("%s\n", xstr(ERROR_A));
于 2012-05-07T10:26:10.010 に答える