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”是否有一个单独的堆栈,还是它们对所有宏都使用相同的堆栈?
您的代码实际上被预处理为:
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您只能节省函数调用时间。 但是可以通过使用内联函数来归档相同的更好的文件。
在只能使用宏的情况下避免使用宏。