C 预处理器宏替换

C Preprocessor macro substitution

我正在尝试进行宏替换,但它不起作用,这是代码:

#define COMLOG      2
#define __COM_ESPECIAL_print(__a, __comNumber)  COM##__comNumber##_print(__a)
#define COM_LOG_print(__a)      __COM_ESPECIAL_print(__a, COMLOG)

但是当我尝试调用时:

COM_LOG_print("pepe");

它进行了非预期的替换:

undefined reference to COMCOMLOG_print

我希望得到的:

COM2_print

有什么想法吗?

您需要一个额外的宏来扩展 __comNumber 参数:

#define __COM_ESPECIAL_print_EXP(__a, __comNumber)  COM##__comNumber##_print(__a)

原因是 ## 运算符(就像 # 一样)没有扩展其参数。

完整示例可能如下所示:

#include <stdio.h>

#define COMLOG      2
#define __COM_ESPECIAL_print_EXP(__a, __comNumber)  COM##__comNumber##_print(__a)
#define __COM_ESPECIAL_print(__a, __comNumber)  __COM_ESPECIAL_print_EXP(__a, __comNumber)
#define COM_LOG_print(__a)      __COM_ESPECIAL_print(__a, COMLOG)

void COM2_print(const char *s)
{
    printf("%s\n", s);  
}

int main(void)
{
    COM_LOG_print("pepe");
    return 0;
}

输出:

pepe