Могу ли я объявить массив констант в препроцессоре? - PullRequest
0 голосов
/ 27 января 2019

У меня есть сегмент кода, который в основном делает следующее

int* pins = {2, 3, 5, 7, 10}
for (i = 0; i < NUM_OUTPUTS; ++i{
    output[i].pin = pins[i];
}

(обратите внимание, что числа не соответствуют какой-либо различимой схеме, поэтому они должны быть предварительно объявлены)

Я бы хотел, чтобы это было сделано в препроцессоре, так как массив pins впоследствии не будет затронут. Я понимаю, что мне, вероятно, придется пройтись по циклу, так как я недостаточно опытен с макросами препроцессора, чтобы сделать цикл и сделать назначение (хотя это было бы круто).

Я нашел Это , но я не думаю, что это именно то, что я хочу.

Можно ли что-то подобное сделать? Прежде всего, чтобы освободить время загрузки / использование памяти.

Редактировать: больше информации. Все, что я пытаюсь сделать, это настроить выходы во время компиляции - я полагаю, что для этого мне нужно перебрать все выходы в препроцессоре.

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Вы можете сделать еще один шаг и определить составной литерал , чтобы он при необходимости расширялся:

#define PINS (int[]){2, 3, 5, 7, 10}
#define NUM_OUTPUTS (int)(sizeof PINS / sizeof PINS[0])
...
    for (int i = 0; i < NUM_OUTPUTS; i++)
        output[i].pin = PINS[i];

( примечание: составной литерал поддерживается в C99 + или расширением компилятора.)

0 голосов
/ 27 января 2019

Если после этого массив выводов не будет затронут, вы можете использовать составной литерал вместо создания pins массива.

Вы можете сделать:

#include <stdio.h>

#define PINS (int[]){2, 3, 5, 7, 10}   //compound literal
#define NUM_OUTPUTS (sizeof(PINS)/(sizeof(PINS[0])))
#define INIT(arr) \
        for (size_t i = 0; i < NUM_OUTPUTS; i++) { \
            arr[i].pin = PINS[i]; \
        }

struct st_pin {
    int pin;
};

int main()
{
    struct st_pin arr[NUM_OUTPUTS];

    INIT(arr);

    //Printing arr
    for (size_t i = 0; i < NUM_OUTPUTS; ++i){
        printf ("arr[%zu].pin: %d\n", i, arr[i].pin);
    }

    return 0;
}

Вывод:

arr[0].pin: 2
arr[1].pin: 3
arr[2].pin: 5
arr[3].pin: 7
arr[4].pin: 10
0 голосов
/ 27 января 2019
for (i = 0; i < NUM_OUTPUTS; ++i)
    output[i].pin = (int []) {2, 3, 5, 7, 10} [i];
...