gpt4 book ai didi

c - 从 C 宏中提取参数

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:09 25 4
gpt4 key购买 nike

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

#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 是一个符号,因此它可能在别处定义。幸运的是,如果它是未定义的,这不是问题,或者它只是一个简单的类型——毕竟,宏做的第一件事就是“扔掉左边的部分”。但正如 Jonathan Leffler 评论的那样

Note that if GPIOC maps to a macro containing commas, you're likely to get compilation errors.

关于c - 从 C 宏中提取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com