c 中的宏数组——是否可能

Array of macros in c -- is it possible

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

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

然后我想使用特定的pin时只需要调用下面的

LED_On(ARR_LED[some_number])

当我尝试这样做时,出现 ARR_LED 未声明(首次在此函数中使用)错误。

例如,当我尝试调用 SPECIFICPIN(x) 时,其中 x 是 for 循环中的一个整数迭代器,我收到一条错误消息,提示类似 'LEDx_PIN' undeclared...

您需要研究您的术语。 宏数组 是不可能的。宏不是数据类型,而是纯 文本替换 在您的程序实际编译之前。

我想“使用宏填充数组”就是您想要做的。但是在编译时循环中不可能做到这一点——你似乎想通过你的ioport_pin_t宏尝试来实现。宏无法扩展到比您最初提供的更多的文本元素实例。没有通过宏扩展在编译时循环和重复扩展宏这样的功能。

您的 for 循环在 运行 时循环,而宏在编译时展开。一旦您了解预处理器做了什么,编译器做了什么,以及完成的程序在 运行 时间做了什么,您就会发现那是行不通的。

类似

#define P(X) {(LED##X##_PIN)}

ioport_pin_t *commands[LED_COUNT] = {
  P(0), P(1), P(2),......}

#undefine P

这将是最接近您想要的东西。请注意,预处理器的主要用途不是让您省去打字工作 - 您最好在编辑器中使用复制和粘贴,实现相同的目的并获得更清晰的代码。

作为 tofro 答案的数组是可行的方法。然而,在无法简单地用数组解决的情况下,还有另一种方法 switch

#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: ...
    }
}