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 中弹出 X
和 Y
的代码来确认这种解释,但恢复最初为 X
和 Y
推送的值分别是:
#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);
}
X=X0.
Y=Y0.
Pushed X.
Pushed Y.
X=X1.
Y=Y1.
Popped X.
Popped Y.
X=X0.
Y=Y0.
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 中弹出 X
和 Y
的代码来确认这种解释,但恢复最初为 X
和 Y
推送的值分别是:
#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);
}
X=X0. Y=Y0. Pushed X. Pushed Y. X=X1. Y=Y1. Popped X. Popped Y. X=X0. Y=Y0.