【问题标题】:Preprocessor Conditionals预处理器条件
【发布时间】:2013-11-08 15:51:35
【问题描述】:

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

//////////////////////////////////////////// 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( ),这似乎是一种更复杂的方法。但是如果我不能用预处理器指令来做到这一点,我只需要使用指向父类的指针。

【问题讨论】:

  • 到底为什么要使用define(而不是普通变量)?这是预处理器指令,它只在编译时执行一次,而不是在运行时。
  • 您完全误解了预处理器指令。它们在编译时进行评估。
  • 普通变量在哪里,以便我可以从这些类的范围内访问它?调用该事件的类甚至都不知道父母的存在。事实上,当它们被实例化时,它们会进入一个类中的一个向量,该类是整个类的成员。

标签: c++ c-preprocessor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    当你写作时

    if (SHUTDOWN)
    

    那么编译器看到的是在预处理完成和编译开始时“SHUTDOWN”的值。所以

    #define SHUTDOWN true
    if (SHUTDOWN)
    

    编译成

    if (true)
    

    #define SHUTDOWN
    
    if (SHUTDOWN)
    

    编译失败,如

    if ()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2012-03-26
      • 1970-01-01
      • 2011-05-16
      • 2020-01-22
      相关资源
      最近更新 更多