C++;在Windows和Linux上编译:ifdef开关 我想在Linux和Windows上运行一些C++代码。我只想为一个操作系统而不是另一个操作系统包含一些代码。是否有一个标准的ifdef可以一次性使用

C++;在Windows和Linux上编译:ifdef开关 我想在Linux和Windows上运行一些C++代码。我只想为一个操作系统而不是另一个操作系统包含一些代码。是否有一个标准的ifdef可以一次性使用,c++,linux,windows,conditional-compilation,ifdefine,C++,Linux,Windows,Conditional Compilation,Ifdefine,比如: #ifdef LINUX_KEY_WORD ... // linux code goes here. #elif WINDOWS_KEY_WORD ... // windows code goes here. #else #error "OS not supported!" #endif 这个问题确实是重复的,但这里的答案要好得多,尤其是公认的答案。不,这些定义依赖于编译器。您可以做的是,使用自己的定义集,并在Makefile上设置它们。有关更多

比如:

  #ifdef LINUX_KEY_WORD
    ... // linux code goes here.
  #elif WINDOWS_KEY_WORD
    ... // windows code goes here.
  #else 
  #error "OS not supported!"
  #endif


这个问题确实是重复的,但这里的答案要好得多,尤其是公认的答案。

不,这些定义依赖于编译器。您可以做的是,使用自己的定义集,并在Makefile上设置它们。有关更多信息,请参阅。

使用:

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

#endif

这取决于使用的编译器

例如,Windows的定义可以是
WIN32
\u WIN32


Linux的定义可以是
UNIX
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果在Linux上使用G++和Windows上使用VC++进行编译,则可以:

#ifdef linux
    ...
#elif _WIN32
    ...
#else
    ...
#endif

此响应与宏war无关,但如果找不到匹配的平台,则会产生错误

#ifdef LINUX_KEY_WORD   
... // linux code goes here.  
#elif WINDOWS_KEY_WORD    
... // windows code goes here.  
#else     
#error Platform not supported
#endif
如果不支持
#error
,则可以使用static_assert(C++0x)关键字。或者,您可以实现自定义静态断言,或者只声明大小为0的数组,或者使用具有重复大小写的开关。简而言之,在编译时产生错误,而不是在运行时产生错误。您可以执行以下操作:

#if MACRO0
    //code...
#elif MACRO1
    //code...
#endif
…其中标识符可以是:

在linux上定义的linux __sun在Solaris上定义 __FreeBSD\在FreeBSD上定义 __NetBSD\在NetBSD上定义 __OpenBSD\在OpenBSD上定义 __苹果在Mac OS X上定义 __在HP-UX上定义的hpux __在Tru64 UNIX上定义的osf(以前是DEC OSF1) __在Irix上定义的sgi _在AIX上定义的AIX _Windows上定义的WIN32
我知道这不是答案,但如果有人在Qt中看起来相同,则会添加答案

在Qt中


有这样一个标准。那些不依附于它的工具链,要么是有车的,石器时代的,要么就是坏的。@rubenvb:标准是?想发布一个答案或至少一个URL吗?@MestreLion Predef项目已经被吸收到Boost中,但是所有的宏仍然列在这里的文档中:
WIN32
是在
Windows.h
中定义的。因此,如果未包含标题,则类型开关将不起作用<代码>\u WIN32默认情况下应定义。正确,但不正确helpful@Cicada:当所有编译器(值得一提)都做相同的事情时,依赖编译器没有任何意义。然而,没有标准定义这一点,这正是他所要求的。我正在更新答案,以将其指向一个关于此的有用参考。我很高兴您建议将makefile作为“依赖于编译器”定义的替代品。使用相同定义的编译器多于使用makefiles的编译器。编译器不使用makefiles,makefiles使用编译器。这将始终适用。所有编译器都以相同的方式实现这一点。linux上的Clang模仿GCC,Windows上的Clang和GCC模仿MSVC。@rubenvb:为了方便起见,所有现有的编译器。这种行为不是标准化的,对于一些没有人使用的编译器来说可能会有所不同。@MooingDuck:我确认我想确定的是目标操作系统,而不一定是所使用的编译器。这个答案更好,因为它直接回答了这个问题,我的Ubuntu Trusty上可能有一天会死掉的第三个站点,而不是仅仅提供一个链接,只有
\uuuu linux\uuu
起作用。
\uuuulinux
linux
都不起作用。我刚刚发现我正在构建的一个项目通过了-std=c++0x,它设置了
\uuuuuulinux
,而不是
\uuuuuulinux
,必须支持
\error
(与作为扩展的
\warning
不同)。但我同意这不一定是使构建失败的最佳方式。@Thomas:的确如此。幸运的是,如果在一些不兼容的实现中不支持
#error
,那么预处理器语句错误的结果就是一个错误。如果它也不是一个错误,那么编译器就是一个非常糟糕的编译器,无论如何都不值得支持(尽管我高度怀疑这样的编译器是否存在)。
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
}