如果我定义了两个宏:
#define MAC1(X) {something here}
#define MAC2(X,Y) {something here}
并像这样创建第三个:
#define MAC3(X,Y) MAC1(X); MAC2(X,Y)
您能否说明在代码中调用
MAC3
时将如何评估? 最佳答案
如果在您尝试实例化MAC3
时已经声明了MAC1
和MAC2
,您将获得
{something here}; {something here}
换句话说,
MAC1
和MAC2
将依次扩展。但是,如果在使用
MAC1
后声明了MAC2
和MAC3
(这是不太可能的),则它们将不会扩展。考虑以下示例:
#define A B
#define B 5
int main()
{
printf("%d", A);
return 0;
};
即使
5
之后声明了B
,它也将输出A
。重要的是,在您对使用时A
已经声明了B
。在您的示例中要注意的另一个重要思想是,
X
将被评估两次。例如,如果您这样调用MAC3
:i = 0;
MAC3(i++, 1);
最后
i
的值将是2
(假设MAC1
和MAC2
都使用X
一次)。