【问题标题】:Redefining or changing macro value重新定义或更改宏值
【发布时间】:2012-03-05 16:19:18
【问题描述】:

我目前正在开发一个用 MFC C++ 编写的已开发项目,并且面临一个已存在的宏具有以下定义的问题:

#define HEIGHT_TESTS 13

我正在尝试从代码中更改值,但我认为由于它是经过预处理的定义,我无法做到这一点。有没有一种方法可以解决这个问题,而无需整体更改原始宏(因为它可能会影响程序的原始功能)。我只是打算在一个特定的条件下改变它,在其他任何地方都保持不变。

只是为了让大家知道,我显然已经尝试使用不同的宏定义,我打算使用值 (17),但没有运气。

任何帮助将不胜感激。

【问题讨论】:

  • 我建议为您的目的使用另一个宏,而不是#undefining 和重新定义它。
  • 请注意,如果需要恢复,您将无法保存现有值并恢复它。您唯一的方法是用 13 重新定义宏,这显然是一个硬编码值。至于答案,你下面已经有2个是正确的了。
  • 我确实尝试过使用不同的宏,但没有成功。程序崩溃。只有当我更改这个特定的#define 值时,它才会给我一个正确的结果(不是我打算在这个特定条件下得到的结果)。

标签: c++ mfc macros redefinition


【解决方案1】:

类似于以下内容:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13

【讨论】:

    【解决方案2】:

    您可以undefine 和define 再次:

    #include <iostream>
    
    #define AAA 13
    
    int main()
    {
        #undef AAA
        #define AAA 7
        std::cout << AAA;
    }
    

    输出:7

    请注意,以# 开头的语句是预处理器指令,甚至在编译代码之前就已经处理好了。在这种情况下,这个常量 AAA 将被 7 简单地替换,即它就像文本替换一样工作,没有额外的语法检查,没有类型安全等......

    ...这是您应该避免使用宏和#defines 的主要原因,因为它们可以被静态函数和变量替换:)


    为什么是“文本替换”?

    看看这段代码:

    #include <iostream>
    
    #define AAA 13
    
    void purePrint() {
        std::cout << AAA;
    }
    
    void redefAndPrint() {
        #undef AAA
        #define AAA 7
        std::cout << AAA;
    }
    
    int main()
    {
        #undef AAA
        #define AAA 4
        purePrint();
        redefAndPrint();
        purePrint();
    }
    

    预处理器从上到下逐行执行,这样做:

    • 啊,#define AAA 13,所以下次我点击AAA时,我会放在那里13
    • 看,purePrint 使用 AAA,我将其替换为 13
    • 等等,现在他们告诉我使用7,所以我将停止使用13
    • 所以在这里redefAndPrint() 我会放在那里7

    将给定的代码转换成这个:

    #include <iostream>
    
    void purePrint() {
        std::cout << 13;
    }
    
    void redefAndPrint() {
        std::cout << 7;
    }
    
    int main()
    {
        purePrint();
        redefAndPrint();
        purePrint();
    }
    

    将输出13713,而最新的#define AAA 4根本不会被使用。

    【讨论】:

    • @Nerds.Dont.Swear:是的。而当你调用#undef AAA时,你甚至不用担心AAA之前是否定义过。
    • 这个答案非常令人困惑。有人认为他们可以在运行时重新定义宏。
    • 没错,这就是我的意思,有人认为他们可以undefdefineif (someCondition) {#undef macro #define macro newValue} 这样的宏,他们声称这篇文章告诉他们这是可能的。虽然帖子没有这么说,但它并没有对此提出警告,也许改进它是一个好主意。
    • 我认为你修复了这个旧帖子是一件好事,因为它很有用。谢谢。
    • 你不应该缩进那些 PP 指令。它使它们看起来好像在函数范围内,但预处理器没有任何范围的概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2019-08-05
    • 2021-07-26
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多