c - 如何在 C 中形成#define 常量名?
问题描述
我在头文件中有一个#defines 列表。例如
#define NUM1 123
#define NUM2 456
#define NUM3 789
...
#define NUM1000 111213
在我的函数中,我得到一个int
参数arg
。的值arg
可以在 1 到 1000 之间。根据我想在上面分配的 arg 值定义一个变量。IE
void func(int arg){
if (arg == 1) {var = NUM1;}
....
if (arg == 50) {var = NUM50;}
....
if (arg == 1000) {var = NUM1000;}
}
如何在不使用 if 或 switch 语句的情况下实现这一点?我尝试使用 char 数组来形成#define
常量名:
void func(int arg){
char name[10];
sprintf(name,"NUM%d",arg);
var = name;
}
但我没有看到预期值。任何帮助将不胜感激。
解决方案
如何在不使用 if 或 switch 语句的情况下实现这一点?
您可以将所有 1000 个常量放入一个数组中,然后使用它arg
来选择您想要的那个。
int list[1000] = {NUM1, NUM2, NUM3, NUM4...NUM1000};
void func(int arg){
var = list[arg - 1]; // use arg-1 because C arrays start from zero
}
如何在 C 中形成#define 常量名?
你不能,如果你能,它不会帮助你。使用#define 创建的宏由预处理器处理。也就是说,在您的代码发送到编译器本身之前,预处理器会扫描它并将每个宏名称(例如NUM1
)替换为相应的值(例如123
)。然后将生成的代码传递给编译器,因此编译器甚至看不到宏名称。因此,即使您可以在运行时以某种方式动态创建宏名称,也无法将该名称连接回源代码中与之关联的值。
推荐阅读
- c# - 如何在gridview中设置选定的视图
- c# - MVC 5 远程验证未触发
- sql-server - 从开发环境切换到暂存环境时出现错误 - ASP.Net Core MVC
- c# - 启动dll时C#环境堆栈溢出
- javascript - 将 Unix 时间戳转换为日期时间字符串
- c# - 使用 Windows 窗体应用程序在不打开打印对话框的情况下打印 pdf 文件
- python - 张量流错误:从分类列组成交叉列
- apache-kafka - 使用 Kafka Streams DSL 多次将同一主题用作源
- node.js - 如何修改mongodb/mongoose中私有路由的schema方法?
- c++ - 如何设置自定义小部件的背景颜色和边框宽度?