其他分享
首页 > 其他分享> > c – 重新定义或更改宏值

c – 重新定义或更改宏值

作者:互联网

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

#define HEIGHT_TESTS 13

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

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

任何帮助将非常感激.

解决方法:

您可以取消定义它并再次定义:

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

标签:c,macros,mfc,redefinition
来源: https://codeday.me/bug/20190928/1828378.html