我有一个文件,其中包含大约 100 个#define,从 1 到 100,每个都有一个唯一的字符串值。
现在我正在尝试打印此值,但我想打印#define 是什么而不是该值。例如:
#define FIRST_VALUE 1
var = FIRST_VALUE;
printf("%s", var);
我希望 printf 打印 FIRST_VALUE,而不是 1。
有没有办法在C中做到这一点?还是我必须在 switch 语句中写出 100 多个 case 块?
我有一个文件,其中包含大约 100 个#define,从 1 到 100,每个都有一个唯一的字符串值。
现在我正在尝试打印此值,但我想打印#define 是什么而不是该值。例如:
#define FIRST_VALUE 1
var = FIRST_VALUE;
printf("%s", var);
我希望 printf 打印 FIRST_VALUE,而不是 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));
}
该程序将输出:
FIRST_MACRO
在与我在学校的一位助教交谈后,我们决定最好的方法是编写一个 AWK 脚本来处理头文件并自动生成所有需要的案例语句。
多谢你们!
你不能完全按照你的意愿去做,因为当编译器得到预处理器输出时,“ONE”标记早已不复存在。但是,如果您的目标是编写一次常量列表但同时生成标记和字符串,则可以这样做。
首先,使用宏将常量构建为头文件中的枚举。文件枚举.h:
#ifndef ENUMS_H
#define ENUMS_H
#ifndef 枚举
#define ENUM(name,val) enum { name = val };
#万一
枚举(一,1)
枚举(二,2)
枚举(三,3)
#endif /* ENUMS_H */
其次,在 .c 文件中重新定义宏以创建字符串/整数映射并将 .h 文件包含在正确的位置。文件枚举.c:
#包括
#包括
类型定义结构{
字符 *str;
整数值;
} 描述枚举;
静态 DescriptiveEnum 枚举[] = {
#define ENUM(name,val) { #name, val },
#include “枚举.h”
};
#define NUM_ENUMS (sizeof(enums)/sizeof(enums[0]))
char *enum_to_str(int val)
{
诠释我;
对于 (i=0;i<NUM_ENUMS;i++) {
if (enums[i].val == val) 返回 enums[i].str;
}
返回 ””;
}
现在枚举常量和映射函数都可供调用者使用。文件 main.c:
#include <stdio.h>
#include <stdlib.h>
#include “枚举.h”
char *enum_to_str(int val);
int main(int argc, char *argv[])
{
整数值;
值=一;
printf("%d %s\n",val,enum_to_str(val));
返回 EXIT_SUCCESS;
}