【发布时间】:2020-11-29 07:03:54
【问题描述】:
// 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”是否有单独的堆栈,或者它们对所有宏使用相同的堆栈?
【问题讨论】:
-
啊,好吧。我对他们的措辞感到困惑,这听起来像是有一个单独的堆栈:“将 macro-name 宏的值保存在堆栈的顶部 for this macro” .我正在使用宏,因为它是一个嵌入式(又名内存受限)环境,它们可以节省空间。不幸的是,每个字节都很重要:(
-
宏不节省任何空间:)。编译器甚至看不到宏。它们只是(简化)文本替换。宏实际上(与内联函数相同)会增加 FLASH 消耗,因为代码会重复多次。
-
当涉及到大型宏时,这是肯定的。我的意思是作为常量的简单的,比如
#define BUFFER_SIZE 1024。 -
它们对代码大小或内存消耗没有任何影响。 #defines 用于命名常量并为整个程序定义一个。那么你只需要在一个地方而不是很多地方改变这个值。
-
push and pop 宏定义是应该不惜一切代价避免的事情
标签: c++ c visual-c++ preprocessor