想象一下,你有许多标识符,例如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
。
答案 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"
可能不符合您的要求。