预处理器条件

时间:2013-11-08 15:51:35

标签: c++ c-preprocessor

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

//////////////////////////////////////////// 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();

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

2 个答案:

答案 0 :(得分:0)

您误解了预处理程序符号的使用。将预处理器代码视为与c / c ++代码纠缠在一起的单独代码。在编译时,执行预处理器代码并执行导致源代码,然后编译器将其转换为二进制代码。您不能在运行时使用预处理程序符号,因为它们不存在(它们已被编译掉)。看来你可能想要在你正在做的事情中使用全局范围的变量。

答案 1 :(得分:0)

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

完成编译阶段后,宏(#define值)将被有效替换为instanations。

写作时

if (SHUTDOWN)

然后编译器看到的是预处理完成和编译正确开始时“SHUTDOWN”的值。所以

#define SHUTDOWN true
if (SHUTDOWN)

编译到

if (true)

,而

#define SHUTDOWN

if (SHUTDOWN)

错误地编译,如

if ()

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