我目前正在开发一个用MFC C ++编写的已经开发的项目,并且我遇到了一个已经存在的定义宏的问题:
#define HEIGHT_TESTS 13
我正在尝试从代码中更改值,但我认为,因为它是一个预处理的定义,我无法做到这一点。有没有办法解决这个问题而不必整体改变原始宏(因为它可能会影响程序的原始功能)。我只是想在一个特定的条件下改变它,在其他地方休息它仍然是相同的。
只是为了让每个人都知道,我显然已尝试使用不同的宏定义和我打算使用的值(17),但没有运气。
非常感谢任何帮助。
答案 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
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)