我有许多定义,由两个逗号分隔的表达式组成,如下所示:

#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是一个符号,因此可能在其他地方定义。幸运的是,如果它是未定义的,或者它是一个简单的类型,这不是一个问题-毕竟,宏做的第一件事是“扔掉左边的部分”。但正如乔纳森·莱夫勒评论的那样
注意,如果GPIOC映射到包含逗号的宏,则可能会出现编译错误。

10-08 13:30