C++ 在编译时确定操作系统

C++ 在编译时确定操作系统,c++,qt,operating-system,C++,Qt,Operating System,我是QT新手,我正在努力理解如何在执行主功能之前确定操作系统。我是这方面的新手,所以任何指导都将不胜感激 我想确定程序是否在以下环境之一中运行: Windows Unix Linux Mac 我如何在主函数中使用这些数据 非常感谢您可以使用预处理器定义来确定代码在哪个平台上编译 例如,要检查您是否在Windows上,请执行以下操作: #if (defined (_WIN32) || defined (_WIN64)) // windows code #endif 对于Linux: #

我是QT新手,我正在努力理解如何在执行主功能之前确定操作系统。我是这方面的新手,所以任何指导都将不胜感激

我想确定程序是否在以下环境之一中运行:

Windows
Unix
Linux
Mac
我如何在主函数中使用这些数据


非常感谢

您可以使用预处理器定义来确定代码在哪个平台上编译

例如,要检查您是否在Windows上,请执行以下操作:

#if (defined (_WIN32) || defined (_WIN64))
    // windows code
#endif
对于Linux:

#if (defined (LINUX) || defined (__linux__))
    // linux code
#endif
…等等,针对您感兴趣的每个平台。这样,与目标平台无关的代码将被删除

下面是一些使用此功能的代码的示例:

#include <iostream>

int main()
{
    #if (defined (_WIN32) || defined (_WIN64))
        std::cout << "I'm on Windows!" << std::endl;
    #elif (defined (LINUX) || defined (__linux__))
        std::cout << "I'm on Linux!" << std::endl;
    #endif
}
#包括
int main()
{
#如果(已定义(_WIN32)|已定义(_WIN64))

std::cout您可以将预处理器宏与
-DOPERATING_SYSTEM=
一起使用,并使用它设置变量的值

enum OperatingSystem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAX};
OperatingSystem os = OPERATING_SYSTEM;

它假定
操作系统
被定义为上述系统之一。

Qt本身为Qt支持的不同平台定义了预处理器开关。它们看起来都像
Q\u OS*
-该*-部分被不同的操作系统所取代。例如,这将是:

  • Windows:
    Q_OS_WIN
    Q_OS_WIN32
    Q_OS_WIN64
    (还有一些,例如,
    Q_OS_WINCE
    ,但是
    Q_OS_WIN
    是为所有类似操作系统的窗口定义的)
  • Unix:
    Q\u OS\u Unix
  • Linux:
    Q_OS_Linux
    (请注意,
    Q_OS_UNIX
    也是在Linux上定义的)
  • Mac:
    Q\u OS\u Mac
    (用于OsX和iOs),
    Q\u OS\u OsX
    Q\u OS\u Mac
所有这些平台头都在
qsystemdetection.h
中定义。该文件包括几乎所有受支持的操作系统及其预处理器开关的列表。

这很好


所有其他示例涵盖了要点,但只是为了澄清:

#include <QtGlobal>
#include <QDebug>

enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAC};

#if (defined (Q_OS_WIN) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64))
    OperatingSystem os = OS_WINDOWS;
#elif (defined (Q_OS_UNIX))
    OperatingSystem os = OS_UNIX;
#elif (defined (Q_OS_LINUX))
    OperatingSystem os = OS_LINUX;
#elif (defined (Q_OS_MAC))
    OperatingSystem os = OS_MAC;
#endif

int main() {

    switch(os) {
         case OS_WINDOWS: qDebug() << "Windows"; break;
         case OS_UNIX   : qDebug() << "Unix"; break;
         case OS_LINUX  : qDebug() << "Linux"; break;
         case OS_MAC    : qDebug() << "Mac"; break;
         default        : qDebug() << "Unknown"; break;
    }

} 
#包括
#包括
枚举操作系统{OS_WINDOWS、OS_UNIX、OS_LINUX、OS_MAC};
#if(已定义(Q_OS_WIN)|已定义(Q_OS_WIN32)|已定义(Q_OS_WIN64))
操作系统os=os_WINDOWS;
#elif(已定义(Q_OS_UNIX))
操作系统os=os_UNIX;
#elif(定义(Q_OS_LINUX))
操作系统os=os_LINUX;
#elif(定义(Q_OS_MAC))
操作系统os=os_MAC;
#恩迪夫
int main(){
交换机(os){

由于OSL定义的Quebug(C++)条件编译通常使用,因为源代码必须为每个OS重新编译。因为QQT是QueTimeT的新版本,Qt是C++库,请在引用C++库时确保使用正确的Qt。Qt也发音为“可爱”,而不是“Que Tee”。谢谢你的回答。我还有一个问题:如果我在Linux机器上编译你的示例,然后将程序转移到Windows机器上。结果会不同吗?还是会显示“我在Linux上!”?谢谢!如果该程序是为Linux编译的,它无论如何也不会在Windows上运行:)哦,对不起。但是Qt程序肯定会同时在Windows和Linux上运行吗?@NSPredator是的,但您必须重新编译。Qt允许您重新编译而不必更改代码,但您仍然需要为目标平台重新编译。当c编写代码:
“OperatingSystem”没有在函数int main中命名类型
,并且
os没有在此范围内声明
当您在每个“OperatingSystem os”前面添加“static”时会发生什么…”我发现了问题:您错误地拼写了变量
OperatingSystem
,根据我的经验,它应该是
OperatingSystem
Q_OS_UNIX是为所有基于UNIX的操作系统定义的,包括Mac OS X。因此,上面示例中的OS_Mac案例无法访问,因为它总是首先到达OS_UNIX案例。感谢您确认Q_OS_UNIX是在Linux上定义的。
#include <QtGlobal>
#include <QDebug>

enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAC};

#if (defined (Q_OS_WIN) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64))
    OperatingSystem os = OS_WINDOWS;
#elif (defined (Q_OS_UNIX))
    OperatingSystem os = OS_UNIX;
#elif (defined (Q_OS_LINUX))
    OperatingSystem os = OS_LINUX;
#elif (defined (Q_OS_MAC))
    OperatingSystem os = OS_MAC;
#endif

int main() {

    switch(os) {
         case OS_WINDOWS: qDebug() << "Windows"; break;
         case OS_UNIX   : qDebug() << "Unix"; break;
         case OS_LINUX  : qDebug() << "Linux"; break;
         case OS_MAC    : qDebug() << "Mac"; break;
         default        : qDebug() << "Unknown"; break;
    }

}