平台C预处理器定义

时间:2009-07-13 13:11:01

标签: c++ c-preprocessor portability

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

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

5 个答案:

答案 0 :(得分:9)

我的书签中有this sourceforge pre-compiler页面。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

C和C ++标准都没有定义这样的符号,因此您将受到特定C或C ++实现的支配。常用符号列表是一个有用的东西,但遗憾的是我还没有。

答案 3 :(得分:0)

我不认为存在一个通用的平台定义列表,因为我看到的每个跨平台库都有一个ad-hoc config.h,这些库充满了这些东西。但你可以考虑查看libpng,zlib等相当可移植的库所使用的那些。

以下是libpng

使用的内容

答案 4 :(得分: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以了解您可以收集哪些信息。)