我想知道是否可以创建类似于宏数组的东西。 我已经实现了以下有效的代码:
struct led_cmds_
{
ioport_pin_t *commands[LED_COUNT] ;
} ;
struct led_cmds_ the_led_cmd_ ;
void populate() {
the_led_cmd_.commands[0] = SPECIFICPIN(0);
}
并在主要:
int main(void)
{
//.....
populate();
LED_On(the_led_cmd_.commands[0]);
}
SPECIFICPIN(x)的宏定义为:
#define SPECIFICPIN(X) (LED##X##_PIN)
我所希望的是一种方法来做这样的事情:
#define ioport_pin_t* ARR_LED[LED_COUNT] \
for (int j = 0; j < LED_COUNT; j++) ARR_LED[j] = SPECIFICPIN(j);
然后只需要在我想使用特定引脚
时调用以下内容LED_On(ARR_LED[some_number])
当我尝试这样做时,我得到一个未声明的ARR_LED(在此函数中首次使用)错误。
当我尝试调用SPECIFICPIN(x),其中x是for循环中的int迭代器,我得到一个错误,例如&#39; LEDx_PIN&#39;未申报...
答案 0 :(得分:5)
您需要处理自己的术语。 数组是不可能的。在实际编译程序之前,宏不是数据类型,而是纯粹的文本替换。
我猜&#34; 使用宏填充数组&#34;是你想要做的。但是在编译时循环中
宏没有能力扩展到比您最初给出的更多文本元素实例。在编译时通过宏扩展没有循环这样的功能,并且重复扩展宏。您的ioport_pin_t
循环在运行时循环,而宏在编译时展开。一旦你自己意识到预处理器完成了什么,编译器完成了什么,以及完成的程序在运行时完成了什么,你就会发现它不起作用。
像
这样的东西for
最接近您想要的东西是最接近的。请注意,预处理器的主要用途不是为了节省您的打字工作量 - 您最好使用复制和放大器。粘贴在你的编辑器中,实现同样的目标并拥有更清晰的代码。
答案 1 :(得分:0)
作为tofro答案的阵列是要走的路。但是,如果无法通过阵列简单地解决问题,那么还有另一种方法可以使用开关
#define SPECIFICPIN(X) (LED##X##_PIN)
void setpin(int pin, int value)
{
switch (pin)
{
case 1:
SPECIFICPIN(1) = value;
doSomething(); // if needed
break;
case x: ...
default: ...
}
}