gpt4 book ai didi

c预处理器宏在扩展后连接参数

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

我正在为 avr gpio 编写一个驱动程序,我有一个函数接受一个枚举输入。我制作了一个宏,在将端口名称与“__”连接后调用此函数,因此我始终可以使用 initPort(PORTA,1,...)。

#define initPort(port,mask,dir,pullup) GPIO_Init(port ## __,mask,dir,pullup)

typedef enum {
PORTA__,
PORTB__,
PORTC__,
PORTD__
} PORT;

void GPIO_Init(PORT p, uint8_t pins, Direction dir,uint8_t pullup) {
switch (p) {
case PORTA__:

现在,当我想使用该函数时,我使用:initPort(PORTA,1,...) 并且它工作正常。问题是当我想使用类似的东西时:

#define LED_PORT PORTA
initPort(LED_PORT,1,...)

现在发生的是 GPIO_Init 的参数现在是 LED_PORT__ 而不是 PORTA__

是否可以解决这个问题,或者我必须使用其他方法?

最佳答案

您实际上可以通过强制预处理器在之前执行额外的传递来做到这一点:

#define initPortS(port,mask,dir,pullup) GPIO_Init(port ## __,mask,dir,pullup)
#define initPort(...) initPortS(__VA_ARGS__)
#define LED_PORT PORTA

initPort(LED_PORT,1,2,3);

这样做会:

第一遍:

initPort(LED_PORT,1,2,3); -> initPortS(PORTA,1,2,3);

第二遍:

initPortS(PORTA,1,2,3); -> GPIO_Init(PORTA__,1,2,3);

Here is a demo

可能的陷阱:

如果 PORTA 是定义的符号,它也会在第二遍展开。所以如果你有这样一行

#define PORTA XXX

在代码的某处,它将展开成

GPIO_Init(XXX__,1,2,3);

关于c预处理器宏在扩展后连接参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465770/

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