乍一看,编写一个打印其参数的 C 宏似乎是小菜一碟。以下程序应该可以工作,即它应该打印x
但它会产生编译错误,因为x的数据类型,编译器将其作为变量,是未知的。现在看起来不那么明显了。不是吗?你猜怎么着,下面的也行不通
但是,如果我们知道 C 语言的一个鲜为人知的特性,那么编写这样的宏真的是小孩子的游戏。
在 C 中,有一个 # 指令,也称为“字符串化运算符”,它可以做到这一点。基本上 # 指令将其参数转换为字符串。瞧!剩下的事情就是这么简单。所以上面的程序可以修改如下。
现在,如果输入是PRINT(x),它将打印x。事实上,如果输入是PRINT(52cxydh),它将打印52cxydh。
#define PRINT(x) (x)
int main()
{
printf("%s",PRINT(x));
return 0;
}
#define PRINT(x) ('x')
#define PRINT(x) ("x")
#define PRINT(x) (#x)
int main()
{
printf("%s",PRINT(x));
return 0;
}