从C宏中提取参数

时间:2015-06-13 21:39:03

标签: c macros arguments c-preprocessor

我有许多定义,包含两个以逗号分隔的表达式,如下所示:

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

1 个答案:

答案 0 :(得分:4)

不要为此使用宏。如果必须,以下方法将首先丢弃左侧部分,以便保留数字。小心使用。没有保证。

#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符号,因此可能在别处定义。幸运的是,它不是一个问题,如果它是未定义的,或者只是一个简单的类型 - 毕竟,宏的第一件事就是&#34;扔掉左边的部分&#34;。但正如乔纳森·莱弗勒所言,

  

请注意,如果GPIOC映射到包含逗号的宏,则可能会出现编译错误。