C 预处理器宏替换

C Preprocessor macro substitution

提问人:togarha 提问时间:8/14/2015 最后编辑:Brian Tompsett - 汤莱恩togarha 更新时间:5/28/2016 访问量:466

问:

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

#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

有什么想法吗?

C-预处理器

评论

3赞 Some programmer dude 8/14/2015
与您的问题无关,但没有带有双前导下划线的名称,它们在所有范围内都是保留的。
1赞 Richard Chambers 8/14/2015
看看 stackoverflow.com/questions/1489932/... 以及 stackoverflow.com/questions/2202147/... 以及 stackoverflow.com/questions/8587965/...
0赞 togarha 8/14/2015
@JoachimPileborg 首先我只加下划线,但测试它,我改成两个只是为了测试......我忘了把它归还给一个
0赞 Some programmer dude 8/14/2015
@togarha 然后,你有一个下划线,后跟一个大写字母,该字母在所有范围内也是保留的。:)
0赞 togarha 8/14/2015
@SouravGhosh拼写错误,我想写preprocesor,但我的手指不太好(现在是星期五)

答:

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 个,非常感谢