2009-02-08 3 views
3

나는 약 100 개의 #define이있는 파일, 1-100의 파일을 가지고 있으며 각각 고유 한 문자열 값이 있습니다.변수를 #defines로 자동 바꾸기

이제는이 값을 인쇄하려고하는데 값 대신 #define을 인쇄하고 싶습니다. 예를 들면 :

#define FIRST_VALUE 1 
var = FIRST_VALUE; 
printf("%s", var); 

그리고 내가 printf와는 FIRST_VALUE를 인쇄 할뿐만 1.

C에서이 작업을 수행 할 수있는 방법이 있나요? 또는 switch 문 안에 100 개 이상의 case 블록을 작성해야합니까?

당신은 당신이 찾고있는 무엇을 달성하기 위해 stringification을 사용할 수 있습니다

답변

1

내 TA의 학교 중 하나에 이야기 한 후, 우리는 결정했습니다 이렇게하는 가장 좋은 방법은 헤더 파일을 처리하고 필요한 모든 case 문을 자동으로 생성하는 AWK 스크립트를 작성하는 것입니다.

고마워요!

12

:

#define FIRST_MACRO 
    #define MACRO_TO_STRING(x) #x 

    #include <stdio.h> 

    main() { 
    printf("%s\n", MACRO_TO_STRING(FIRST_MACRO)); 
    } 

이 프로그램의 출력 :

 
FIRST_MACRO 
+0

이것은 내가 비슷한 메커니즘을 사용한다고 생각하는 Windows Message Maps에 대해 언급했을 때 얻은 것입니다. –

+0

그래도 원래의 질문에는 답이 없습니다. 그는 변수 값에 따라 매크로 "name"을 동적으로 인쇄하려고합니다. –

0

컴파일러가 프리 프로세서 출력을 얻을 때까지 "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; 
}