如果我定义了两个宏:

#define MAC1(X) {something here}
#define MAC2(X,Y) {something here}

并像这样创建第三个:
#define MAC3(X,Y) MAC1(X); MAC2(X,Y)

您能否说明在代码中调用MAC3时将如何评估?

最佳答案

如果在您尝试实例化MAC3时已经声明了MAC1MAC2,您将获得

{something here}; {something here}

换句话说,MAC1MAC2将依次扩展。

但是,如果在使用MAC1后声明了MAC2MAC3(这是不太可能的),则它们将不会扩展。

考虑以下示例:

#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(假设MAC1MAC2都使用X一次)。

10-06 02:18