Как сформировать #define имя константы в C? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть список #defines в заголовочном файле. * 1001 например *

#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 константы name:

void func(int arg){
    char name[10];
    sprintf(name,"NUM%d",arg);
    var = name;
}

Но я не вижу ожидаемого значения. Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Как мне добиться этого без использования оператора 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
}

Как сформировать #define имя константы в C?

Вы не можете, и если бы могли, это не помогло бы вам. Макросы, созданные с помощью #define, обрабатываются препроцессором. То есть, прежде чем ваш код будет отправлен самому компилятору, препроцессор просматривает его и заменяет каждое имя макроса (например, NUM1) на соответствующее значение (например, 123). Полученный код затем передается компилятору, поэтому компилятор даже не видит имена макросов. Таким образом, даже если вы могли бы каким-то образом динамически создавать имя макроса во время выполнения, не было бы способа соединить это имя обратно со значением, которое было связано с ним в исходном коде.

0 голосов
/ 20 марта 2019

Зачем беспокоиться с #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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...