Macros C语言预处理器行为
在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行。因此,您的问
#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))))