C 语言中有不同类型的宏,嵌套宏就是其中之一。
考虑使用以下宏的程序
#define HYPE(x,y) (SQUR(x)+SQUR(y))
#define SQUR(x) (x*x)
使用这个我们可以成功编译以获得结果。
众所周知, C 预处理器将替换所有标识符替换为替换字符串。考虑到上面的例子,我想知道 C 预处理器遍历程序多少次用替换值替换宏。我认为不可能一次完成。
答案 0 :(得分:1)
当实际使用“HYPE”时进行更换。 #define语句出现时不会展开。
例如:
1 #define FOO 1
2
3 void foo() {
4 printf("%d\n", FOO);
5 }
因此替换发生在第5行,而不是第1行。因此,您的问题的答案是:一次。
答案 1 :(得分:0)
A #define
扩展宏调用,直到没有更多的术语要扩展,除非它没有递归。例如:
#define TIMES *
#define factorial(n) ((n) == 0 ? 1 : (n) TIMES factorial((n)-1))
// Doesn't actually work, don't use.
假设您说factorial(2)
。它将扩展到((2) == 0 ? 1 : (2) * factorial((2)-1))
。请注意,factorial
已展开,然后TIMES
也会展开,但factorial
之后不再展开,因为这将是递归。
但请注意,嵌套(可以说是一种不同类型的“递归”)实际上在同一个表达式中多次展开:
#define ADD(a,b) ((a)+(b))
....
ADD(ADD(1,2),ADD(3,4)) // expands to ((((1)+(2)))+(((3)+(4))))