C语言预处理器行为

时间:2010-05-29 03:56:21

标签: macros c-preprocessor

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

考虑使用以下宏的程序

#define HYPE(x,y) (SQUR(x)+SQUR(y))
#define SQUR(x)   (x*x)

使用这个我们可以成功编译以获得结果。

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

2 个答案:

答案 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))))