コンパイラがプリプロセッサの出力を取得するまでに、「ONE」トークンがなくなってしまっているため、やりたいことを正確に行うことはできません。ただし、定数のリストを 1 回書き込み、トークンと文字列の両方を生成することが目標である場合は、これを行うことができます。
まず、マクロを使用して定数を列挙型としてヘッダー ファイルに作成します。ファイル enums.h:
#ifndef ENUMS_H
#ENUMS_H を定義
#ifndef ENUM
#define ENUM(name,val) enum { name = val };
#endif
ENUM(ONE,1)
ENUM(TWO,2)
ENUM(THREE,3)
#endif /* ENUMS_H */
次に、マクロを .c ファイルで再定義して、文字列/整数のマッピングを作成し、.h ファイルを適切な場所に含めます。ファイル enums.c:
#含む
#含む
typedef 構造体 {
char *str;
int 値;
} DescriptiveEnum;
static DescriptiveEnum enums[] = {
#define ENUM(name,val) { #name, val },
#include "enums.h"
};
#define NUM_ENUMS (sizeof(enums)/sizeof(enums[0]))
char *enum_to_str(int val)
{
int i;
for (i=0;i<NUM_ENUMS;i++) {
if (enums[i].val == val) return enums[i].str;
}
戻る "";
}
これで、列挙型定数とマッピング関数の両方が呼び出し元で利用できるようになりました。ファイル main.c:
#include <stdio.h>
#include <stdlib.h>
#include "enums.h"
char *enum_to_str(int val);
int main(int argc, char *argv[])
{
int 値;
値 = 1;
printf("%d %s\n",val,enum_to_str(val));
EXIT_SUCCESS を返します。
}