我有一个代码段,基本上可以完成以下操作
int* pins = {2, 3, 5, 7, 10}
for (i = 0; i < NUM_OUTPUTS; ++i{
output[i].pin = pins[i];
}
(请注意,数字不会遵循任何可识别的模式,因此必须预先声明)
我希望在预处理器中完成此操作,因为此后将不会触及pins
数组。我知道我可能需要循环遍历,因为我对预处理器宏没有足够的经验进行循环并进行分配(尽管那很酷)。
我找到了This,但我认为这不是我想要的。
可以做这样的事情吗?主要是为了节省启动时间/内存使用量。
编辑:更多信息。我要做的只是在编译时设置输出-我想我需要遍历预处理器中的所有输出。
答案 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 +或编译器扩展支持复合文字。)