컴파일러가 프리 프로세서 출력을 얻을 때까지 "ONE"토큰은 오래 전에 사라 졌으므로 원하는 것을 정확하게 수행 할 수 없습니다. 그러나 한 번만 상수 목록을 작성하고 토큰과 문자열을 모두 생성하는 것이 목표라면이 작업을 수행 할 수 있습니다.
먼저 매크로를 사용하여 헤더 파일에서 열거 형으로 상수를 작성하십시오. 파일 enums.h :
#ifndef ENUMS_H
#define 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 :
#include
#include
typedef struct {
char *str;
int val;
} 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;
}
return "";
}
이제는 열거 형 상수와 매핑 기능을 모두 호출자가 사용할 수 있습니다. 파일 main.c :
#include <stdio.h>
#include <stdlib.h>
#include "enums.h"
char *enum_to_str(int val);
int main(int argc, char *argv[])
{
int val;
val = ONE;
printf("%d %s\n",val,enum_to_str(val));
return EXIT_SUCCESS;
}
이것은 내가 비슷한 메커니즘을 사용한다고 생각하는 Windows Message Maps에 대해 언급했을 때 얻은 것입니다. –
그래도 원래의 질문에는 답이 없습니다. 그는 변수 값에 따라 매크로 "name"을 동적으로 인쇄하려고합니다. –