预处理器条件

Preprocessor Conditionals

本文关键字:条件 处理器 预处理      更新时间:2023-10-16

我想知道是否可以在条件中使用在代码中某个点更改值的定义。基本上是这样的:

//////////////////////////////////////////// SomeFile.cpp
#define SHUTDOWN false
while(window->isOpen())
{
    if(SHUTDOWN)
        window->close();
    // Rest of the main loop
}
//////////////////////////////////////////// SomeOtherFile.cpp
if(Escape.isPressed())
{
    #undef SHUTDOWN
    #define SHUTDOWN true
}

从而导致应用程序关闭。如果不是,会有一个像

RenderWindow* getWindow()
{
    return window;
}

然后呼叫

if(Escape.isPressed())
    getWindow()->close();

最好的方法是什么?我宁愿不走那条路,因为调用键事件的类是控制主循环和窗口的类的成员,所以我必须在较小的类中设置指向包含类的指针来调用 getWindow(),这似乎是一个更复杂的方法。但是,如果我不能使用预处理器指令来做到这一点,我只需要使用指向父类的指针。

您误解了预处理器符号的使用。 将预处理器代码视为与 C/C++ 代码纠缠在一起的单独代码。 在编译时,执行预处理器代码,该执行会产生源代码,然后编译器将其转换为二进制。 不能在运行时使用预处理器符号,因为它们不存在(它们被编译掉了)。 看来您可能希望在正在执行的操作中使用全局范围的变量。

预处理器条件只是编译的第一个预处理阶段之前的条件。

一旦编译阶段完成,宏(#define 值)就会被有效地替换

当你写的时候

if (SHUTDOWN)

那么编译器看到的是预处理完成和编译正确开始时的"SHUTDOWN"值。所以

#define SHUTDOWN true
if (SHUTDOWN)

编译为

if (true)

#define SHUTDOWN
if (SHUTDOWN)

编译失败,如

if ()

如果要 #define SHUTDOWN 解析为变量,那么是的,这是绝对可能的,因为变量可以在运行时更改。但常量不会。