1

假设您有许多标识符,例如 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

4

2 回答 2

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;
}
于 2013-11-06T10:35:54.527 回答
1

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

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

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

于 2013-11-06T10:21:33.943 回答