在C++中从另一个宏调用多个宏

dan*_*nny 3 c++ macros preprocessor

您好,我有一个关于在C++中使用宏的问题.如果我定义了两个宏并创建第三个这样的宏:

#define MAC1(X) {something here}
#define MAC2(X,Y) {something here}
Run Code Online (Sandbox Code Playgroud)

所以现在第三个定义如下:

#define MAC3(X,Y) MAC1(X); MAC2(X,Y)
Run Code Online (Sandbox Code Playgroud)

您能否澄清MAC3如果在代码中调用将如何评估?

Ish*_*ael 7

如果当你尝试实例化MAC3两者MAC1并且MAC2已经声明时,你就会得到

{something here}; {something here}
Run Code Online (Sandbox Code Playgroud)

换句话说,MAC1并且MAC2将依次得到扩展.

但是,如果MAC1MAC2你使用后声明MAC3(这是不太可能),他们将不会得到扩展.

请考虑以下示例:

#define A B
#define B 5

int main()
{
    printf("%d", A);
    return 0;
};
Run Code Online (Sandbox Code Playgroud)

它会输出5,即使B是在之后声明A.重要的是,当您使用时 A B已经宣布.

在您的示例中需要注意的另一个重要事项是,X将对其进行两次评估.例如,如果你这样打电话MAC3:

i = 0;
MAC3(i++, 1);
Run Code Online (Sandbox Code Playgroud)

最后的值i将是2(假设两者MAC1MAC2使用X一次).

  • 不。#define是由对语言本身了解甚少的预处理器扩展的。它只是做字符串替换。 (2认同)