C预处理器宏替换

时间:2015-08-14 11:16:19

标签: c macros c-preprocessor

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

#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

有什么想法吗?

1 个答案:

答案 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