用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?

Posted

技术标签:

【中文标题】用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?【英文标题】:Macros for GCC/G++ to differentiate Linux and Mac OSX? 【发布时间】:2011-02-03 16:35:01 【问题描述】:

用于区分 Linux 和 Mac OSX 的 GCC/G++ 宏?

【问题讨论】:

How do I check OS with a preprocessor directive? 的可能重复项 【参考方案1】:

我更倾向于测试功能可用性而不是平台名称。尝试使用autoconf。

否则,这是a comprehensive list of platform defines。

还有check out this page 用于定义编译器、库、架构和设备。

【讨论】:

谢谢,但我避免使用 autoconf。我只想使用简单的宏。 +1 表示“预定义”链接。 wiki 中有更多更高一级的定义。让我改进你的回复。【参考方案2】:

我使用__MACH__ 来测试 Mac OS X - 它并不是 Mac OS X 100% 独有的(那里可能仍然有一些旧的 NeXT 盒子!)但它足以区分 Mac 和 Linux 之间的区别。

【讨论】:

APPLE 涵盖 Mac OS X 和 ios,因此它比 MACH 恕我直言。根据我的经验,它也更常见 @Hans-ChristophSteiner APPLE 看起来并没有在 OS X 上定义。 我猜@Hans 的意思是__APPLE__ ?但即便如此,我也不确定它是否 100% 可靠? 是的,谢谢,我的意思是 __APPLE____MACH__,在我之前的评论中看起来像是 wiki 格式错误。【参考方案3】:

如果必须,请使用__APPLE__ 宏检测 OSX。如果可以的话,最好使用configure 来检测功能,但并不是所有的东西都可以这样。

【讨论】:

是的,我在我的代码中选择了这种方式。我只有 Linux 和 Apple,所以没有问题。谢谢。 我发现使用像__APPLE__ 这样的编译器定义的宏非常有用,因为您可以在很多时候将代码与构建系统分离。然后,在移植到 android 或 Chrome NaCl 等深奥的平台时,它会让你的喜欢变得更容易,这些平台不一定适合 ./configure 和朋友 @Hans-Christoph:一个好的交叉编译环境应该会有所帮助。 Android NDK 是一个很好的交叉编译器,我经常使用它来使用 ./configure 构建项目但是对于许多项目来说,编写一个快速的 Android.mk 就容易多了,然后您可以免费获得一个集成良好的构建系统。【参考方案4】:

下次您想在平台上检查 GCC 支持的预定义宏时,使用标志 -dM 运行预处理器。它将列出系统上所有可用的预定义宏。例如:

$ touch dummy.hxx
$ cpp -dM ./dummy.hxx
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 2147483647
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __FLT_EVAL_METHOD__ 0
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __UINTMAX_TYPE__ long unsigned int
#define __linux 1
#define __unix 1
#define __linux__ 1
...

【讨论】:

@Viet:不客气……实际上我最近遇到了和你类似的难题。我想知道是否有一个预定义的宏指示机器的字节顺序。经过数小时的搜索,我在一些晦涩的文档中发现了这一点! 对于 OS X 上的 GCC,您可以使用 echo | g++ -dM -E - 我喜欢这样的回答。它回答了一切。 请注意,C 和 C++ 有不同的定义;我必须在 cpp 命令中添加 -x c++ 以获取用于 C++ 的值。 @Calmarius 它内置在 GCC 中。当它运行预处理器时,它会使用这些预定义的宏。 GCC 公开 -dM 标志以列出这些宏。

以上是关于用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?的主要内容,如果未能解决你的问题,请参考以下文章

#define 用于在 C 中调试打印的宏?

将模板参数传递给 MSVC 中的宏

用于替换表中的值的宏

Linux编辑器-vim使用 && Linux编译器-gcc/g++使用

我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等

我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等