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
}