【问题标题】:Are pragma push/pop_macro directive stacks unique to each macro?pragma push/pop_macro 指令堆栈是否对每个宏都是唯一的?
【发布时间】:2020-11-29 07:03:54
【问题描述】:

微软提供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”是否有单独的堆栈,或者它们对所有宏使用相同的堆栈?

【问题讨论】:

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

标签: c++ c visual-c++ preprocessor


【解决方案1】:

每个宏都有自己的堆栈。正如您链接到的文档所说,push_macro“将 macro-name 宏的值保存在堆栈顶部为此宏,”和pop_macro “将 macro-name 宏的值设置为 此宏 堆栈顶部的值。”

我们可以用弹出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。 推了X。 推Y。 X=X1。 Y=Y1。 弹出X。 弹出Y。 X=X0。 Y=Y0。

【讨论】:

  • 如果你printpop_macro之间,你的例子会更清楚,我想
  • 哦,抱歉 - 我的意思是在 #pragma pop_macro("X") 之后打印 XY,以查看 X 被弹出而 Y 没有被弹出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2020-09-02
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2016-02-14
  • 2020-03-26
相关资源
最近更新 更多