7

我正在用 C++ 编写一个小型库,我需要能够在很多不同的平台上构建它,包括 iPhone、Windows、Linux、Mac 和 Symbian S60。我已经编写了大部分代码,使其与平台无关,但有些部分必须在每个平台的基础上编写。

目前,我通过根据当前平台包含不同的标头来实现这一点,但我无法充实这一点,因为我不确定为所有平台定义了哪些预处理器定义。对于 Windows,我通常可以依靠查看 WIN32 或 _WIN32。对于 Linux,我可以依赖 _UNIX_,但我不太确定其他平台或它们的 64 位变体。是否有人列出了在平台上找到的不同定义,或者我必须求助于配置文件或 gcc 参数?

4

5 回答 5

9

我的书签中有这个 sourceforge 预编译器页面。

于 2009-07-13T15:08:07.477 回答
1

定义将完全取决于您的编译器供应商。如果您在所有平台上都使用相同的编译器(例如 gcc),那么您会更轻松一些。

您可能还想尝试组织您的项目,以使大多数 .h 文件不依赖于平台。将您的实现(cpp 文件)拆分为单独的文件;一个用于非特定的东西,一个用于每个平台。特定于平台的可以包含仅对该平台有意义的“私有”标头。您可能必须制作适配器函数才能让这样的东西 100% 工作(当系统库采用略有不同的参数时)但我发现它最终真的很有帮助,并且引入一个新平台要容易得多在将来。

于 2009-07-13T14:50:04.133 回答
0

C 和 C++ 标准都没有定义此类符号,因此您将受制于特定的 C 或 C++ 实现。拥有一个常用符号列表会很有用,但不幸的是我没有。

于 2009-07-13T13:16:37.463 回答
0

我认为不存在一个通用的平台定义列表,因为我见过的每个跨平台库都有一个包含这些东西的临时 config.h。但是您可以考虑查看一些可移植的库,如 libpng、zlib 等。

这是libpng使用的那个

于 2009-07-13T14:30:56.053 回答
0

如果您想查看具有 GCC 的给定系统(例如 Mac OS X、iOS、Linux)的默认预处理器符号,您可以从命令行获取完整列表,如下所示:

echo 'main(){}' | cpp -dM

然而,这些通常用途有限,因为在预处理器运行的编译阶段,大多数符号仅标识托管编译器的系统的操作系统和 CPU 类型,而不是目标系统(例如,当交叉- 为 iOS 编译)。在 Mac OS X 和 iOS 上,确定目标系统的编译时特性的正确方法是

#include <TargetConditionals.h>

这将从当前使用的平台和 SDK 中获取 TargetConditionals.h,然后您可以从某些宏中确定(例如)字节顺序和其他一些特征。(查看 TargetConditionals.h 以了解您可以收集哪些信息。)

于 2011-08-31T15:05:12.593 回答