を参照してください。私はあなたの実装の正確なロジックを知らないので、私はその議論に入ることはありません。
#define CONV2STRING(X) #X
#define TO_STRING(X) CONV2STRING(X)
#define EXPAND(Y) Y
#define MERGER(X, Y) X##Y
#define MERGE(X, Y) MERGER(X, Y)
#define SAY_HELLO HELLO
#define SAY_BYE BYE
typedef enum {
HELLO0BYE = 0,
HELLO1BYE = 1,
HELLO2BYE = 2,
HELLO3BYE = 3,
HELLO4BYE = 4,
HELLO5BYE = 5,
} enum_test;
const static struct {
enum_test value;
const char *str;
} conversion [] = {
{HELLO0BYE, "HELLO0BYE"},
{HELLO1BYE, "HELLO1BYE"},
{HELLO2BYE, "HELLO2BYE"},
{HELLO3BYE, "HELLO3BYE"},
{HELLO4BYE, "HELLO4BYE"},
{HELLO5BYE, "HELLO5BYE"},
};
int StringToEnum (const char *str) {
int j;
for (j = 0; j < sizeof (conversion)/sizeof (conversion[0]); ++j)
if (!strcmp (str, conversion[j].str))
return conversion[j].value;
return -1;
}
int main(int argc, char** argv)
{
enum_test output;
#define INPUT 5
output = StringToEnum(TO_STRING (MERGE(MERGE(SAY_HELLO, EXPAND(INPUT)), SAY_BYE)));
printf("Macro Expansion : %s\n", TO_STRING (MERGE(MERGE(SAY_HELLO, EXPAND(INPUT)), SAY_BYE)));
printf("output = %d\n", output);
#undef INPUT
#define INPUT 4
output = StringToEnum(TO_STRING (MERGE(MERGE(SAY_HELLO, EXPAND(INPUT)), SAY_BYE)));
printf("Macro Expansion : %s\n", TO_STRING (MERGE(MERGE(SAY_HELLO, EXPAND(INPUT)), SAY_BYE)));
printf("output = %d\n", output);
#undef INPUT
}
注:私は、文字列から列挙hereにエレガントな変換を見つけたあなたはこれを使用することができます。
'number'は前処理' stage'に値を持たない。これはプリプロセッサのトークンに過ぎません。 –
出力の例を追加できますか? – BetaRunner
マクロ拡張では識別子のようなトークンの間に '## 'が現れることに注意してください。最初の '## 'は誤りです。 –