用于访问具有相似名称的标识符的宏

时间:2013-11-06 10:15:13

标签: c macros c-preprocessor stringification

想象一下,你有许多标识符,例如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

2 个答案:

答案 0 :(得分:2)

您不需要字符串化:

#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;
}

答案 1 :(得分:1)

您可能必须将连接包装到另一个宏:

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

请注意,STRINGIFY - 宏会使您的结果"UART1REG"可能不符合您的要求。