我接手了一个使用c语言编写的项目,其中有许多宏。
我想使用一个新的宏来检查该宏是否已启用。
但符号#
在宏中被保留。如何修复我的代码?谢谢:)
#define CHECK_MACRO( macro )\
#ifdef macro
printf("defined "#macro"\n");\
#else
printf("not defined "#macro"\n");\
#endif
我接手了一个使用c语言编写的项目,其中有许多宏。
我想使用一个新的宏来检查该宏是否已启用。
但符号#
在宏中被保留。如何修复我的代码?谢谢:)
#define CHECK_MACRO( macro )\
#ifdef macro
printf("defined "#macro"\n");\
#else
printf("not defined "#macro"\n");\
#endif
附注 - m4预处理器 - 历史/遗留问题。
在Unix的早期,'m4'处理器用于代码生成。它具有cpp的增强功能(或者cpp可能是m4的简化版)。特别地,它更好地支持多行宏定义,它继续被用于各种软件包中。
值得注意的是,向你的代码中添加代码生成将使其更加复杂,难以维护/调试。
例如:a.m4
define(`CHECK_MACRO', `
#ifdef $1
printf ("defined #$1\n") ;
#else
printf ("undef #$1\n") ;
#endif
')
#include <stdio.h>
void main(void)
{
CHECK_MACRO(FOO) ;
CHECK_MACRO(BAR) ;
}
然后构建/运行
m4 a.m4 > a.c
cc a.c
./a.out
undef #FOO
undef #BAR
cc a.c -DFOO
./a.out
defined #FOO
undef #BAR
%.c: %.m4:
m4 -s $< > $@
其中-s选项有助于跟踪源代码行号(它将编译错误行号匹配到a.m4源文件)。