c ++函数中间的预处理器指令?

Preprocessor directive in middle of c++ function?

void VoxelTerrain::set_stream(Ref<VoxelStream> p_stream) {
    if (p_stream == _stream) {
        return;
    }

    _stream = p_stream;

#ifdef TOOLS_ENABLED
    if (_stream.is_valid()) {
        if (Engine::get_singleton()->is_editor_hint()) {
            Ref<Script> script = _stream->get_script();
            if (script.is_valid()) {
                // Safety check. It's too easy to break threads by making a script reload.
                // You can turn it back on, but be careful.
                _run_stream_in_editor = false;
                _change_notify();
            }
        }
    }
#endif

    _on_stream_params_changed();
}

上面函数中的#ifdef什么时候执行?我认为 # 表示在实际代码之前执行的预处理器指令。然而在这段代码中,预处理器的东西似乎引用了一个只能在编译和执行后实例化的实际对象?

When does the #ifdef execute in the above function?

它在“编译器”看到代码之前执行。如果预处理器知道TOOLS_ENABLED符号是什么,那么预处理器继续将这段代码传递给编译器。

如果预处理器不知道 TOOLS_ENABLED 是什么,那么它将跳过这段代码,并且不会将该代码传递给编译器。

这是一个常见的技巧,通常允许“调试”版本进行一系列额外的验证以确认没有错误发生,但要从“发布”版本中消除所有这些缓慢的双重检查,以便它们 运行 超级快。