代码之家  ›  专栏  ›  技术社区  ›  ONLYA

定义一个名称与“##”操作部分串联的宏

  •  0
  • ONLYA  · 技术社区  · 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
    

    倒数第二行是对此类函数的错误使用。我应该如何正确定义这样一个宏?

    1 回复  |  直到 1 年前
        1
  •  0
  •   John Bollinger    1 年前

    不能使用标记粘贴来构造要定义的宏的名称。 #define 指令需要类型为的单个预处理标记 标识符 用作宏名称。在执行宏扩展之前,标记粘贴是不相关的,而宏扩展是在设置了宏定义之后才执行的。

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

    #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
    

    到后者。