【发布时间】:2016-04-08 06:36:43
【问题描述】:
我想知道是否可以创建类似宏数组的东西。 我已经实现了以下有效的代码:
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 undeclared (first use in this function) 错误。
当我尝试调用 SPECIFICPIN(x) 时,例如,其中 x 是 for 循环中的一个 int 迭代器,我收到一条错误消息,例如“LEDx_PIN”未声明...
【问题讨论】:
-
不知道您是否使用 gcc 工具链,但无论如何您都需要将 C99 用于 avr-gcc(以及它的支持库)——通常与
-Os结合使用。为什么不坚持使用内联函数? -
编译器对宏一无所知,因为在调用编译器之前它们已被 预处理器 替换。因此宏数组是不可能的
-
使用硬件寄存器时,为什么需要一个指针数组?那是可疑的代码。
-
此外,不存在具有可变 I/O 端口数量的硬件。任何集成电路都必须有固定数量的引脚,您不能即时添加和移除它们。只需声明一个对应于最坏情况的数组,然后根据需要使用尽可能多的数组项。
-
你是想给我做噩梦吗?
标签: c c-preprocessor atmel