是否可以在函数外使用if语句(如main)

Is it possible to use if statement outside a function (like main)?

本文关键字:语句 if main 函数 是否      更新时间:2023-10-16

我正在实现一个BOOOS-面向基本对象的操作系统,现在我需要让程序的调度器在FCFS和Priority之间进行选择。我有一个名为Task的类,在其中我创建了两个队列:std::queuestd::priority_queue。这些队列是在Task.h中声明的静态成员,我需要在Task.cc中与类的其他静态成员进行任何其他事情之前进行初始化,比如:

namespace BOOOS {
    volatile Task * Task::__running;
    Task * Task::__main;
    int Task::__tid_count;
    int Task::__task_count;
    std::queue<Task*> Task::__ready;
    std::priority_queue<Task*> Task::__ready;
    (rest of the Task.cc)
}

你可以看到我有两个__准备好的队列。这就是为什么我只需要使用其中一个。如果用户想要初始化FCFS调度器,我会使用没有优先级的调度器;如果用户想要优先级调度器,我则使用priority_queue。这是由BOOS的静态枚举成员控制的。所以,我的问题是:我可以在这部分代码中使用类似于if的东西来只选择一个队列,而不是创建两个队列,并在每次需要在程序中操作它时生成一个if吗?

不,使用if()语句是不可能的。这些实际上需要放在一个功能体中。

您的选择是

  • 使用C预处理器并具有

    #if !defined(USE_PRIORITY_QUEUE)
    std::queue<Task*> Task::__ready;
    #else
    std::priority_queue<Task*> Task::__ready;    
    #endif
    

    预处理器指令。

  • 使用模板类和专用

    template<bool use_priority_queue>
    struct TaskQueueWrapper {
         typedef std::queue<Task*> QueueType;
    };
    template<>
    struct TaskQueueWrapper<true> {
         typedef std::priority_queue<Task*> QueueType;
    };
    TaskQueueWrapper<true>::QueueType Task::__ready;