pragma push/pop_macro 指令堆栈对每个宏都是唯一的吗?

Are pragma push/pop_macro directive stacks unique to each macro?

Microsoft 提供 following example:

// pragma_directives_pop_macro.cpp
// compile with: /W1
#include <stdio.h>
#define X 1
#define Y 2

int main() {
   printf("%d",X);
   printf(" %d",Y);
   #define Y 3   // C4005
   #pragma push_macro("Y")
   #pragma push_macro("X")
   printf(" %d",X);
   #define X 2   // C4005
   printf(" %d",X);
   #pragma pop_macro("X")
   printf(" %d",X);
   #pragma pop_macro("Y")
   printf(" %d",Y);
}

输出:1 2 1 2 1 3

宏“Y”和宏“X”是否有单独的堆栈,或者它们对所有宏使用相同的堆栈?

每个宏都有自己的堆栈。正如您 link 所说的文档,push_macro “Saves the value of the macro-name macro on the top of the stack for this macro,” and pop_macro “将 macro-name 宏的值设置为堆栈顶部的值 对于这个宏。”

我们可以用不在 last-in-first-out-order 中弹出 XY 的代码来确认这种解释,但恢复最初为 XY 推送的值分别是:

#include <stdio.h>

int main(void)
{
    #define X "X0" 
    #define Y "Y0"
    printf("X=%s.\n", X);
    printf("Y=%s.\n", Y);
    #pragma push_macro("X")
    printf("Pushed X.\n");
    #pragma push_macro("Y")
    printf("Pushed Y.\n");
    #undef X
    #undef Y
    #define X "X1"
    #define Y "Y1"
    printf("X=%s.\n", X);
    printf("Y=%s.\n", Y);
    #pragma pop_macro("X")
    printf("Popped X.\n");
    #pragma pop_macro("Y")
    printf("Popped Y.\n");
    printf("X=%s.\n", X);
    printf("Y=%s.\n", Y);
}

which prints:

X=X0.
Y=Y0.
Pushed X.
Pushed Y.
X=X1.
Y=Y1.
Popped X.
Popped Y.
X=X0.
Y=Y0.