c中的宏数组是可能的

时间:2016-04-08 06:36:43

标签: c c-preprocessor atmel

我想知道是否可以创建类似于宏数组的东西。 我已经实现了以下有效的代码:

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]); 
}

SPECIFICPI​​N(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(在此函数中首次使用)错误。

当我尝试调用SPECIFICPI​​N(x),其中x是for循环中的int迭代器,我得到一个错误,例如&#39; LEDx_PIN&#39;未申报...

2 个答案:

答案 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: ...
    }
}