我正在尝试进行宏替换,但它不起作用,这是代码:
#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");
这是一种非预期的替代:
对COMCOMLOG_print的未定义引用
我希望得到什么:
COM2_print
有什么想法吗?
答案 0 :(得分:3)
您需要一个额外的宏来展开__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