c中的宏数组——有可能吗



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

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迭代器)时,我会收到一个错误,上面写着"LEDx_PIN"之类的未声明内容。。。

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

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

for循环在运行时循环,而宏在编译时扩展。一旦你知道了预处理器做了什么,编译器做了什么以及完成的程序在运行时做了什么之后,你就会发现这是行不通的。

类似的东西

#define P(X) {(LED##X##_PIN)}
ioport_pin_t *commands[LED_COUNT] = {
  P(0), P(1), P(2),......}
#undefine P

这将是最接近你想要的东西。注意预处理器的主要用途并不是为了节省你的打字工作量——你最好使用copy&粘贴到编辑器中,实现同样的效果,并拥有更清晰的代码。

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

最新更新