规则1:宏不可递归展开。
为了防止宏无限制的递归展开,当宏遇到自身时,停止展开。
#define F(n) n * F(n - 1)
问1:若有F(3),展开后是什么?
答案:3 * F(2)
问2:此时F(2)是什么?
答案:额。。。我暂时也不知道
规则2:宏二次展开
如果一个宏参数被放进宏体时,这个宏参数首先会被全部展开。
当展开的宏参数被放进宏体时,预处理器对新展开的宏体进行第二次扫描,并继续展开。
规则3:宏不展开
如果对宏参数使用了“#”或者“##”时,宏参数不会被展开。
#include <stdio.h>
#define TO_STRING(x) #x
#define FUNC_NAME(x) #Func(x)
int main()
{
printf("%s\n", TO_STRING(FUNC_NAME(5)));
return 0;
}
输出:FUNC_NAME(5)
如果要输出Func(5),宏该如何定义?
#include <stdio.h>
#define _TO_STRING(x) TO_STRING(x)
#define TO_STRING(x) #x
#define FUNC_NAME(x) #Func(x)
int main()
{
printf("%s\n", _TO_STRING(FUNC_NAME(5)));
return 0;
}