我在头文件中有#defines的列表。 例如
#define NUM1 123
#define NUM2 456
#define NUM3 789
...
#define NUM1000 111213
在我的函数中,我得到一个int
自变量arg
。 arg
的值可以在1到1000之间。
基于我要在上面分配的arg值定义给变量。
即
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;
}
但是我看不到期望值。 任何帮助将不胜感激。
答案 0 :(得分:2)
如何在不使用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
)。然后将生成的代码传递给编译器,因此编译器甚至看不到宏名称。因此,即使您可以以某种方式在运行时动态创建宏名称,也无法将其重新连接回源代码中与之关联的值。
答案 1 :(得分:0)
为什么要打扰#define
。只需使用一个数组即可定义常量并通过函数访问它们。
#include <assert.h>
#include <stdio.h>
const int KNums[] = {
123, // 1
456, // 2
789, // 3
//... fill in the missing elements
111213 // 1000
};
static_assert(sizeof KNums / sizeof *KNums == 1000,
"You need 1000 elements for this to work");
int var;
void func(int arg) {
assert((1 <= arg) && (arg <= 1000));
var = KNums[arg - 1];
}
int main(void) {
func(3);
printf("%d\n", var);
}