我想定义一个宏。它的名称应该由另一个宏连接而成。代码如下:
#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
倒数第二行是该函数的错误用法。我应该如何正确定义这样的宏?
您不能使用标记粘贴来构造要定义的宏的名称。
#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
后者。