2009-02-08 31 views
3

我有一个文件,里面有大约100个#defines,从1-100开始,每个文件都有一个唯一的字符串值。用#defines自动替换变量

现在我试图打印这个值,但不是值,我想打印什么#define。例如:

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

,我想中的printf打印FIRST_VALUE,而不是1

有没有办法在C这样做吗?或者我必须在switch语句中写出100个以上的大小写块吗?

回答

1

谈论我的TA在学校的一个后,我们已经决定,最好的方法是编写一个AWK脚本来处理头文件并自动生成所有需要的case语句。

谢谢你们!

12

您可以使用stringification实现你在找什么:

#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消息映射时,我相信使用类似的机制。 – 2009-02-08 01:15:15

0

由于在编译器获得预处理器输出时,“一个”令牌早已消失,您无法完全按照您的要求进行操作。然而,如果你的目标是写一次常量列表,但同时生成标记和字符串,那么这可以完成。

首先,使用宏将常量作为头文件中的枚举进行构建。文件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; 
}