【问题标题】:Swapping values of macros交换宏的值
【发布时间】:2012-02-22 21:11:51
【问题描述】:

这可能看起来很愚蠢,但我似乎忘记了替换宏的顺序。有人可以帮我弄清楚如何正确交换两个宏的值吗?考虑以下几点:

#include <stdlib.h>
#include <stdio.h>

#define var1 5
#define var2 10

#define _VAL(a) a
#define VAL(a) _VAL(a)


int main(){

    printf("var1 = %d, var2 = %d\n", var1, var2);

#define TEMP VAL(var1)
#undef var1
#define var1 VAL(var2)
#undef var2
#define var2 VAL(TEMP)

    printf("var1 = %d, var2 = %d\n", var1, var2);
}

我想要的只是将var1 替换为10 并将var2 替换为5。关于如何解决这个混乱的任何想法?

我正在尝试使用它来尝试解决另一个问题:

C Macro to protect definitions

【问题讨论】:

  • 这似乎是不必要的复杂和脆弱。有没有其他方法可以做任何你想做的事情?
  • 我认为您不太了解宏的工作原理。它们没有价值。宏只是在编译之前用另一个文本字符串替换一个文本字符串(嗯,基本的)。无论如何,在您的代码上运行预处理器并查看中间输出(有一个编译器选项;您使用的是什么编译器?)。这将阐明问题的根源。
  • @jeffamaphone,我正在使用 gcc,如何查看中间输出。我想在字符串化等示例上对此进行测试:gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification
  • 我对gcc不太熟悉,但相信你在命令行使用-E选项。

标签: c++ c c-preprocessor


【解决方案1】:

做不到。
正如@jeffamaphone 在他的评论中解释的那样,宏定义不是赋值。
#define A B 不关心B 的值。它只记得应该将A 替换为B。后来,当A 出现在源代码中时,它会被替换为B,然后可能会再次被替换为当时定义的B

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多