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: ...
}
}
我想知道是否可以创建类似宏数组的东西。 我已经实现了以下有效的代码:
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: ...
}
}