从 C 宏中提取参数
Extract Argument from C Macro
我有很多定义,由两个逗号分隔的表达式组成,如下所示:
#define PIN_ALARM GPIOC,14
我想将这些定义的第二个表达式(在上述情况下为 14)传递给一元宏,如下所示:
#define _PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
如何提取第二个数字?我想要一个宏,将其命名为 "PICK_RIGHT",它将为我完成此操作:
#define PICK_RIGHT(???) ???
这样我就可以创建一个新的宏来接受我的 "PIN" 定义:
#define PIN_MODE_OUTPUT(???) _PIN_MODE_OUTPUT(PICK_RIGHT(???))
我可以简单地做:
#define RESULT PIN_MODE_OUTPUT(PIN_ALARM)
不要为此使用宏。如果必须,下面的方法将首先丢弃左边的部分,这样就只剩下数字了。小心使用。没有保证。
#define PIN_ALARM GPIOC,14
#define RIGHTPART_ONLY(a,b) b
#define PIN_MODE_OUTPUT(a) RIGHTPART_ONLY(a)
#define RESULT PIN_MODE_OUTPUT(PIN_ALARM)
int main (void)
{
printf ("we'll pick ... %d\n", PIN_MODE_OUTPUT(PIN_ALARM));
printf ("or maybe %d\n", RESULT);
return 0;
}
如果你想把左边的部分作为一个字符串,你可以使用这个(警告和上面一样),左边的部分被#
转换成一个字符串:
#define LEFTPART_ONLY(a,b) #a
#define PIN_MODE_NAME(a) LEFTPART_ONLY(a)
有一个实用的原因,这并非完全没有问题。 GPIOC
是一个 符号 ,因此它可能在别处定义。幸运的是,如果它是未定义的,这不是问题,或者它只是一个简单的类型——毕竟,宏做的第一件事是 "throw away the left part"。但正如 Jonathan Leffler 评论的那样
Note that if GPIOC
maps to a macro containing commas, you're likely to get compilation errors.
我有很多定义,由两个逗号分隔的表达式组成,如下所示:
#define PIN_ALARM GPIOC,14
我想将这些定义的第二个表达式(在上述情况下为 14)传递给一元宏,如下所示:
#define _PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
如何提取第二个数字?我想要一个宏,将其命名为 "PICK_RIGHT",它将为我完成此操作:
#define PICK_RIGHT(???) ???
这样我就可以创建一个新的宏来接受我的 "PIN" 定义:
#define PIN_MODE_OUTPUT(???) _PIN_MODE_OUTPUT(PICK_RIGHT(???))
我可以简单地做:
#define RESULT PIN_MODE_OUTPUT(PIN_ALARM)
不要为此使用宏。如果必须,下面的方法将首先丢弃左边的部分,这样就只剩下数字了。小心使用。没有保证。
#define PIN_ALARM GPIOC,14
#define RIGHTPART_ONLY(a,b) b
#define PIN_MODE_OUTPUT(a) RIGHTPART_ONLY(a)
#define RESULT PIN_MODE_OUTPUT(PIN_ALARM)
int main (void)
{
printf ("we'll pick ... %d\n", PIN_MODE_OUTPUT(PIN_ALARM));
printf ("or maybe %d\n", RESULT);
return 0;
}
如果你想把左边的部分作为一个字符串,你可以使用这个(警告和上面一样),左边的部分被#
转换成一个字符串:
#define LEFTPART_ONLY(a,b) #a
#define PIN_MODE_NAME(a) LEFTPART_ONLY(a)
有一个实用的原因,这并非完全没有问题。 GPIOC
是一个 符号 ,因此它可能在别处定义。幸运的是,如果它是未定义的,这不是问题,或者它只是一个简单的类型——毕竟,宏做的第一件事是 "throw away the left part"。但正如 Jonathan Leffler 评论的那样
Note that if
GPIOC
maps to a macro containing commas, you're likely to get compilation errors.