如何在C中形成#define常数名称?

时间:2019-03-19 21:38:11

标签: c

我在头文件中有#defines的列表。 例如

#define NUM1 123
#define NUM2 456
#define NUM3 789
...
#define NUM1000  111213

在我的函数中,我得到一个int自变量argarg的值可以在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;
}

但是我看不到期望值。 任何帮助将不胜感激。

2 个答案:

答案 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);
}