linux和windows编译规则,在Windows和Linux上进行C ++编译:ifdef switch

本问题已经有最佳答案,请猛点这里访问。

我想在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

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

@MooingDuck:我确认我想确定目标操作系统,而不一定是使用的编译器。

如何在C预处理器中可靠地检测Mac OS X,iOS,Linux,Windows?在C,C ++中检测Windows或Linux

使用:

#ifdef __linux__

//linux code goes here

#elif _WIN32

// windows code goes here

#else

#endif

这个答案更好一点,因为它直接回答了问题,而不仅仅提供了一些可能在某一天死亡的第三个网站的链接

在我的Ubuntu Trusty上,只有__linux__有效。 __linux和linux都不起作用。

我只是发现一个项目im建筑传递-std = c ++ 0x,它设置__linux__,而不是__linux。

当__linux__是?时,__unix__也定义了?

你可以做

#if MACRO0

//code...

#elif MACRO1

//code...

#endif

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

LOL为什么_WIN32 for Windows缺失? :-)

@jamadagni因为那是一个操作系统列表。

@ sorush-r和Win32不代表一个?

@jamadagni:因为在服务器上,没有人需要_WIN32;)

我知道这不是答案,但如果有人在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

}

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

#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)关键字。或者您可以实现自定义STATIC_ASSERT,或者只声明一个大小为0的数组,或者让具有重复个案的开关。简而言之,在编译时而不是在运行时产生错误

谢谢。问题中的代码已被修改。

必须支持#error(与#warning不同,这是一个扩展名)。但我同意它可能不一定是失败构建的最佳方式。

@Thomas:的确如此。幸运的是,如果某些不兼容的实现不支持#error,那么错误的预处理器语句的结果就是错误。如果它也不是错误,那么编译器是一个非常糟糕的编译器并且不值得支持(尽管我非常怀疑这样的编译器存在)。

这取决于使用的编译器。

例如,Windows的定义可以是WIN32或_WIN32。

Linux的定义可以是UNIX或__unix__或LINUX或__linux__。

有这样一个标准。那些不坚持它的工具链,要么是马车,要么是石器老,要么就是坏。

@rubenvb:标准是......?小心发布答案或至少是一个URL?

@MestreLion Predef项目已被吸收到Boost中,但所有的宏仍然在这里的文档中列出:boost.org/doc/libs/release/libs/predef/doc/html/index.html

WIN32在Windows.h内定义。所以,如果标题没有包含类型开关不工作。默认情况下应定义_WIN32。

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

#ifdef linux

...

#elif _WIN32

...

#else

...

#endif

这将永远。所有编译器都以相同的方式实现它。 Clang on linux模仿GCC,Clang和GCC在Windows上模仿MSVC。

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

不,这些定义是依赖于编译器的。你可以做什么,使用你自己的一组定义,并在Makefile上设置它们。有关详细信息,请参阅此主题。

是正确的,但没有帮助

@Cicada:当所有编译器(值得讨论)做同样的事情时,编译器依赖没有意义。

然而,没有标准定义这一点,这就是他所要求的。我更新答案,指出它是一个有用的参考

我很高兴你建议makefile作为"编译器依赖"定义的替代品。更多编译器使用相同的定义而不是使用makefile。

编译器不使用makefile,makefile使用编译器。

Makefile是一种类似unix的解决方案,可以在Windows上使用但不常见。一方面默认安装isnt。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值