定义一个名称由“##”操作符连接的宏

问题描述 投票:0回答:1

我想定义一个宏。它的名称应该由另一个宏连接而成。代码如下:

#ifndef PORT_NUMBER // This macro could be defined in compile time
#define PORT_NUMBER 3
#endif

#define UART_PIN_TX_PORT(x) UART_PIN_TX_PORT_(x)
#define UART_PIN_TX_PORT_(x) UART_PIN_TX_PORT ## x

#ifndef UART_PIN_TX_PORT(PORT_NUMBER)
#define UART_PIN_TX_PORT(PORT_NUMBER) -1 // This line is question. It's wrong but how to do it properly?
#endif

倒数第二行是该函数的错误用法。我应该如何正确定义这样的宏?

c macros
1个回答
0
投票

您不能使用标记粘贴来构造要定义的宏的名称。

#define
指令需要一个identifier类型的预处理标记用作宏名称。在执行宏扩展之前,标记粘贴不相关,这严格是在设置宏定义之后。

我想你是想节省空间,但请注意,这......

#ifndef PORT_NUMBER // This macro could be defined in compile time
#define PORT_NUMBER 3
#endif

#define UART_PIN_TX_PORT(x) UART_PIN_TX_PORT_(x)
#define UART_PIN_TX_PORT_(x) UART_PIN_TX_PORT ## x

#ifndef UART_PIN_TX_PORT(PORT_NUMBER)
#define UART_PIN_TX_PORT(PORT_NUMBER) -1 // This line is question. It's wrong but how to do it properly?
#endif

...已经几乎和...一样大

#ifndef UART_PIN_TX_PORT1
#define UART_PIN_TX_PORT1 -1
#endif

#ifndef UART_PIN_TX_PORT2
#define UART_PIN_TX_PORT2 -1
#endif

#ifndef UART_PIN_TX_PORT3
#define UART_PIN_TX_PORT3 -1
#endif

,但后者更清晰(更不用说正确了)。

如果你想要一点抽象,那么你也可以添加类似的东西

#ifndef UART_PIN_TX_PORT
#define UART_PIN_TX_PORT UART_PIN_TX_PORT3
#endif

后者。

© www.soinside.com 2019 - 2024. All rights reserved.