提问人:togarha 提问时间:8/14/2015 最后编辑:Brian Tompsett - 汤莱恩togarha 更新时间:5/28/2016 访问量:466
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
有什么想法吗?
答:
3赞
Grzegorz Szpetkowski
8/14/2015
#1
您需要一个额外的宏来扩展参数:__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
评论
0赞
togarha
8/14/2015
好的,我还需要一个步骤,我认为 2 个替换就足够了,但它需要 3 个,非常感谢
上一个:从命令行解析数字 argv
评论