重新定义或更改宏值

Neo*_*ile 14 c++ macros mfc redefinition

我目前正在研究一个用MFC C++编写的已经开发的项目,并且我正面临着一个已经存在的定义宏的问题:

#define HEIGHT_TESTS 13
Run Code Online (Sandbox Code Playgroud)

我试图从代码中更改值,但我认为,因为它是一个预处理的定义,我无法做到这一点.有没有办法解决这个问题,而不必整体改变原始宏(因为它可能会影响程序的原始功能).我只是打算在一个特定的条件下改变它,在其他地方休息它仍然是相同的.

只是为了让每个人都知道,我显然尝试使用不同的宏定义和我打算使用的值(17),但没有运气.

任何帮助将非常感激.

Lih*_*ihO 32

您可以undefINE并define再次:

#include <iostream>

#define AAA 13

int main()
{
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}
Run Code Online (Sandbox Code Playgroud)

输出: 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();
}
Run Code Online (Sandbox Code Playgroud)

预处理器从顶部到底部逐行进行,执行此操作:

  • 啊,#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();
}
Run Code Online (Sandbox Code Playgroud)

将输出13713,最新的#define AAA 4将不会被使用.

  • @Nerds.Dont.Swear:是的。而当你调用`#undef AAA`时,你甚至不需要担心`AAA`之前是否被定义过。 (2认同)
  • 这个答案非常令人困惑.有人认为他们可以在运行时重新定义一个宏. (2认同)
  • 确切地说,这是我的观点,有人认为他们可以`undef`和`定义'宏像`if(someCondition){#undef macro #define macro newValue}`他们声称这篇文章告诉他们这是可能的.虽然这篇文章并没有这么说,但它并没有对此提出警告,也许这是改善它的好主意. (2认同)
  • 我认为通过修复这个旧帖子你做了一件好事,因为它很有用.谢谢. (2认同)
  • 您不应该缩进那些 PP 指令。它使它们看起来好像在函数范围内,但预处理器没有任何范围的概念。 (2认同)

hmj*_*mjd 5

类似于以下内容:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13
Run Code Online (Sandbox Code Playgroud)