【问题标题】:Macros to access identifiers with similar names访问具有相似名称的标识符的宏
【发布时间】:2013-11-06 10:15:13
【问题描述】:

假设您有许多标识符,例如 UARTxREG(其中 x 是一个数字)。

有没有办法写宏如:

#define CHANNEL_ONE 1
#define UART_REG(channel)
/* Later */
UART_REG(CHANNEL_ONE) = 1;

所以这将扩展为:

UART1REG

我可以这样做是将文字数字(1、2、3 等)传递给宏,但是当我尝试传入宏时,我遇到了宏无法正确扩展的问题。

我目前有:

#define STRINGIFY(x) #x
#define UART_REG(channel)            STRINGIFY(UART##channel##REG)
/* Later */
UART_REG(UART_ONE) = regVal;

但是这并没有扩展channel

【问题讨论】:

    标签: c macros c-preprocessor stringification


    【解决方案1】:

    你不需要字符串化:

    #include <stdio.h>
    
    #define CHANNEL_ONE 1
    #define UARTREG_(channel) UART##channel##REG
    #define UART_REG(channel) UARTREG_(channel)
    
    int main(void)
    {
        char UART1REG = 'a';
        char UART2REG = 'b';
        char UART3REG = 'c';
    
        UART_REG(CHANNEL_ONE) = 'd';
    
        printf("%c\n", UART_REG(CHANNEL_ONE));
    
        return 0;
    }
    

    【讨论】:

    • 谢谢!两个答案都有效,但这一个删除了额外的步骤。我希望一次性完成所有这些,但这会奏效。
    • 是的。这就是给我带来麻烦的原因。从好的方面来说,我可以抽象宏的实际“行为”,因此对于不同的硬件我可以做不同的事情:-)
    • FWIW,这称为token pasteing
    【解决方案2】:

    您可能必须将您的串联包装到另一个宏:

    #define STRINGIFY(x) #x
    #define UART_REG2(channel)           STRINGIFY(UART##channel##REG)
    #define UART_REG(channel)            UART_REG2(channel)
    

    请注意,STRINGIFY-macro 使您的结果为"UART1REG",这可能不是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多