使用#defines自动替换变量

时间:2009-02-08 00:14:17

标签: c string replace c-preprocessor

我有一个大约有100个#defines的文件,从1-100开始,每个文件都有一个唯一的字符串值。

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

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

我希望printf打印FIRST_VALUE,而不是1。

有没有办法在C中这样做?或者我必须在switch语句中写出100多个case块?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在我在学校的一个TA学习之后,我们决定最好的方法是编写一个AWK脚本来处理头文件并自动生成所需的所有案例陈述。

谢谢你们!

答案 2 :(得分: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;
}