繁体   English   中英

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");

它进行了非预期的替换:

未定义对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM