重新定义或更改宏值

时间:2012-02-14 09:30:41

标签: c++ mfc macros redefinition

我目前正在开发一个用MFC C ++编写的已经开发的项目,并且我遇到了一个已经存在的定义宏的问题:

#define HEIGHT_TESTS 13

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:29)

您可以undef使用它并再次define

#include <iostream>

#define AAA 13

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

输出:7

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

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


为什么“文字替换”?

看看这段代码:

#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将不会被使用。

答案 1 :(得分:4)

如下所示:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13

答案 2 :(得分:0)

#define A 2

#define B(A + 3)

#define C(B + 4)

//我想在这里更改A的值-可能吗?

#define A(C + 6)