[英]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");
它进行了非预期的替换:
未定义对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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.