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");
它进行了非预期的替换:
undefined reference to 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
我正在尝试进行宏替换,但它不起作用,这是代码:
#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");
它进行了非预期的替换:
undefined reference to 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