提问者:小点点

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


Microsoft提供了以下示例:

// 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”是否有一个单独的堆栈,还是它们对所有宏都使用相同的堆栈?


共1个答案

匿名用户

您的代码实际上被预处理为:

int main() {
   printf("%d",1);
   printf(" %d",2);

   printf(" %d",1);

   printf(" %d",2);

   printf(" %d",1);

   printf(" %d",3);
}

宏只是(简化)文本(标记)替换。 “堆栈”与程序堆栈没有任何共同之处。 它是预处理器令牌堆栈,只有一个。

我使用宏是因为它是一个嵌入式(也就是内存有限)环境,它们节省空间。

宏不会节省任何空间。 事实上,宏增加了闪存的消耗,因为每次使用宏时代码都是重复的。 https://godbolt.org/z/8waxt5您只能节省函数调用时间。 但是可以通过使用内联函数来归档相同的更好的文件。

在只能使用宏的情况下避免使用宏。