Macros C语言预处理器行为

Macros C语言预处理器行为,macros,c-preprocessor,Macros,C Preprocessor,在C语言中有不同种类的宏,嵌套宏就是其中之一 考虑使用以下宏的程序 #define HYPE(x,y) (SQUR(x)+SQUR(y)) #define SQUR(x) (x*x) 使用它,我们可以成功地编译以获得结果 众所周知,C预处理器用替换字符串替换所有出现的标识符。考虑到上面的例子,我想知道C预处理器遍历程序多少次以替换值替换宏。我认为这不可能一蹴而就。替换发生在实际使用“炒作”时。当出现#define语句时,它不会展开 例如: 因此,更换发生在第5行,而不是第1行。因此,您的问

C语言中有不同种类的宏,嵌套宏就是其中之一

考虑使用以下宏的程序

#define HYPE(x,y) (SQUR(x)+SQUR(y))
#define SQUR(x)   (x*x)
使用它,我们可以成功地编译以获得结果


众所周知,C预处理器用替换字符串替换所有出现的标识符。考虑到上面的例子,我想知道C预处理器遍历程序多少次以替换值替换宏。我认为这不可能一蹴而就。

替换发生在实际使用“炒作”时。当出现#define语句时,它不会展开

例如:

因此,更换发生在第5行,而不是第1行。因此,您的问题的答案是:一次。

A#define
'd宏调用被展开,直到没有更多的术语可展开,除非它不再递归。例如:

#define TIMES        *
#define factorial(n) ((n) == 0 ? 1 : (n) TIMES factorial((n)-1))
    // Doesn't actually work, don't use.
假设你说的是阶乘(2)。它将扩展到
((2)==0?1:(2)*阶乘((2)-1))
。注意,
factorial
被展开,然后
TIMES
也被展开,但是
factorial
之后不会再次展开,因为这将是递归

但是,请注意,嵌套(可以说是一种不同类型的“递归”)实际上在同一表达式中扩展了多次:

#define ADD(a,b)     ((a)+(b))
....
ADD(ADD(1,2),ADD(3,4)) // expands to ((((1)+(2)))+(((3)+(4))))

听起来像是家庭作业,听起来像是属于家庭作业。SQUR(3+3)的结果是什么?(3+3*3+3)=15. 您需要((x)*(x)),但仍然很差,因为它会对替换进行两次评估。考虑SqUR(随机化)()。
#define ADD(a,b)     ((a)+(b))
....
ADD(ADD(1,2),ADD(3,4)) // expands to ((((1)+(2)))+(((3)+(4))))