在Windows和Linux上进行C++编译:ifdef switch

Sar*_*ica 161 c++ linux windows conditional-compilation ifdefine

我想在Linux和Windows上运行一些c ++代码.有些代码我只希望包含在一个操作系统中,而不包含在另一个操作系统中.是否有标准的#ifdef可以使用?

就像是:

  #ifdef LINUX_KEY_WORD
    ... // linux code goes here.
  #elif WINDOWS_KEY_WORD
    ... // windows code goes here.
  #else 
  #error "OS not supported!"
  #endif
Run Code Online (Sandbox Code Playgroud)

问题确实是重复的,但这里的答案要好得多,尤其是被接受的答案.

Muh*_*ser 167

使用:

#ifdef __linux__ 
    //linux code goes here
#elif _WIN32
    // windows code goes here
#else

#endif
Run Code Online (Sandbox Code Playgroud)

  • 这个答案更好一点,因为它直接回答了问题,而不仅仅提供了一些可能在某一天死亡的第三个网站的链接 (21认同)
  • 我刚刚发现我正在构建的项目以-std = c ++ 0x传递,该项目设置`__linux__`而不是`__linux`。 (2认同)

use*_*227 39

你可以做

#if MACRO0
    //code...
#elif MACRO1
    //code...
#endif
Run Code Online (Sandbox Code Playgroud)

Macro可以是:

    __linux__       Defined on Linux
    __sun           Defined on Solaris
    __FreeBSD__     Defined on FreeBSD
    __NetBSD__      Defined on NetBSD
    __OpenBSD__     Defined on OpenBSD
    __APPLE__       Defined on Mac OS X
    __hpux          Defined on HP-UX
    __osf__         Defined on Tru64 UNIX (formerly DEC OSF1)
    __sgi           Defined on Irix
    _AIX            Defined on AIX
Run Code Online (Sandbox Code Playgroud)

  • LOL为什么_WIN32 for Windows缺失?:-) (56认同)
  • @jamadagni因为那是一个操作系统列表. (14认同)
  • @ sorush-r和Win32不代表一个? (5认同)

Yas*_*ash 35

我知道这不是答案,但如果有人在Qt看起来相同的话

在Qt

https://wiki.qt.io/Get-OS-name-in-Qt

QString Get::osName()
{
#if defined(Q_OS_ANDROID)
    return QLatin1String("android");
#elif defined(Q_OS_BLACKBERRY)
    return QLatin1String("blackberry");
#elif defined(Q_OS_IOS)
    return QLatin1String("ios");
#elif defined(Q_OS_MAC)
    return QLatin1String("osx");
#elif defined(Q_OS_WINCE)
    return QLatin1String("wince");
#elif defined(Q_OS_WIN)
    return QLatin1String("windows");
#elif defined(Q_OS_LINUX)
    return QLatin1String("linux");
#elif defined(Q_OS_UNIX)
    return QLatin1String("unix");
#else
    return QLatin1String("unknown");
#endif
}
Run Code Online (Sandbox Code Playgroud)


Igo*_*Oks 12

这取决于使用的编译器.

例如,Windows的定义可以是WIN32_WIN32.

Linux的定义可以是UNIX__unix__LINUX__linux__.

  • `WIN32` 定义在 `Windows.h` 中。因此,如果未包含标题,则类型开关将不起作用。`_WIN32` 应该是默认定义的。 (5认同)
  • @MestreLion Predef项目已被吸收到Boost中,但所有的宏仍然列在这里的文档中:http://www.boost.org/doc/libs/release/libs/predef/doc/html/index. HTML (2认同)

Aja*_*jay 12

此响应不是宏观战争,而是如果找不到匹配平台则产生错误.

#ifdef LINUX_KEY_WORD   
... // linux code goes here.  
#elif WINDOWS_KEY_WORD    
... // windows code goes here.  
#else     
#error Platform not supported
#endif
Run Code Online (Sandbox Code Playgroud)

如果#error不受支持,则可以使用static_assert(C++ 0x)关键字.或者您可以实现自定义STATIC_ASSERT,或者只声明一个大小为0的数组,或者让具有重复个案的开关.简而言之,在编译时而不是在运行时产生错误

  • 必须支持`#error`**(不像`#warning`这是一个扩展名).但我同意它可能不一定是失败构建的最佳方式. (5认同)
  • @托马斯:确实如此。幸运的是,如果在某些不合规的实现中不支持 `#error`,那么不正确的预处理器语句的结果就是 --- 一个错误。如果它也不是错误,那么编译器就是一个 *REALLY REALLY* 蹩脚的编译器,无论如何都不值得支持(尽管我 *高度* 怀疑这样的编译器是否存在)。 (4认同)

use*_*016 6

这取决于编译器.如果你用Linux上的G ++和Windows上的VC++编译,这将做:

#ifdef linux
    ...
#elif _WIN32
    ...
#else
    ...
#endif
Run Code Online (Sandbox Code Playgroud)

  • @rubenvb:所有*现有*编译器,*方便*.这种行为不是标准化的,对于一些没人使用的编译器也可能不同. (7认同)

归档时间:

查看次数:

165722 次

最近记录:

9 年,11 月 前