C 自动将变量替换为#定义

C 自动将变量替换为#定义,c,string,replace,c-preprocessor,C,String,Replace,C Preprocessor,我有一个文件,其中大约有100个定义,从1到100,每个定义都有一个唯一的字符串值 现在我试图打印这个值,但我想打印的不是这个值,而是#define是什么。例如: #define FIRST_VALUE 1 var = FIRST_VALUE; printf("%s", var); 我希望printf打印第一个值,而不是1 在C语言中有什么方法可以做到这一点吗?或者我必须在switch语句中写出100多个case块吗?您可以使用它来实现所需的功能: #define FIRST_MACRO

我有一个文件,其中大约有100个定义,从1到100,每个定义都有一个唯一的字符串值

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

#define FIRST_VALUE 1
var = FIRST_VALUE;
printf("%s", var);
我希望printf打印第一个值,而不是1

在C语言中有什么方法可以做到这一点吗?或者我必须在switch语句中写出100多个case块吗?

您可以使用它来实现所需的功能:

  #define FIRST_MACRO
  #define MACRO_TO_STRING(x) #x

  #include <stdio.h>

  main() {
     printf("%s\n",  MACRO_TO_STRING(FIRST_MACRO));
  }
#定义第一个宏
#定义宏_到_字符串(x)#x
#包括
main(){
printf(“%s\n”,宏到字符串(第一个宏));
}
此程序将输出:

FIRST_MACRO 第一个宏
在与我在学校的助教交谈后,我们决定最好的方法是编写一个AWK脚本来处理头文件并自动生成所需的所有案例陈述


谢谢大家

您不能完全按照自己的意愿执行,因为当编译器获得预处理器输出时,“一”标记早已不存在了。但是,如果您的目标是只编写一次常量列表,但同时生成标记和字符串,那么这是可以做到的

首先,使用宏将常量构建为头文件中的枚举。文件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 */ #ifndef枚举 #定义枚举 #ifndef枚举 #定义枚举(name,val)枚举{name=val}; #恩迪夫 枚举(一,1) 枚举(二,二) 枚举(三,三) #endif/*枚举*/ 其次,在.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 ""; } #包括 #包括 类型定义结构{ char*str; int-val; }描述数; 静态DescriptiveEnum枚举[]={ #定义枚举(name,val){#name,val}, #包括“enums.h” }; #定义NUM_ENUMS(sizeof(ENUMS)/sizeof(ENUMS[0])) 字符*枚举到字符串(int val) { int i;
for(i=0;这就是我在提到Windows消息映射时的意思,我相信它使用了类似的机制。但这并不能真正回答最初的问题。他希望根据变量的值动态打印宏“name”。 #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; }