我可以在预处理器中声明常量数组吗?

时间:2019-01-27 03:44:41

标签: c c-preprocessor

我有一个代码段,基本上可以完成以下操作

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

(请注意,数字不会遵循任何可识别的模式,因此必须预先声明)

我希望在预处理器中完成此操作,因为此后将不会触及pins数组。我知道我可能需要循环遍历,因为我对预处理器宏没有足够的经验进行循环并进行分配(尽管那很酷)。

我找到了This,但我认为这不是我想要的。

可以做这样的事情吗?主要是为了节省启动时间/内存使用量。

编辑:更多信息。我要做的只是在编译时设置输出-我想我需要遍历预处理器中的所有输出。

3 个答案:

答案 0 :(得分:2)

如果此后不再触摸引脚阵列,则可以使用复合文字而不是创建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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以更进一步,并定义复合文字,以便根据需要对其进行扩展:

#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 +或编译器扩展支持复合文字。)