2009-07-13 77 views
6

我正在用C++编写一个小型库,我需要能够在很多不同的平台上构建,包括iPhone,Windows,Linux,Mac和Symbian S60。我已经编写了大部分代码,以便它是平台不可知的,但有一些部分必须在每个平台上编写。Platform C预处理器定义

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

回答

9

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

+0

我编辑你的链接指向新的wiki-ized版本,尽管Google总是指向旧版本。 – rubenvb 2011-08-31 15:16:43

+0

没关系,谢谢。 – 2011-08-31 15:31:25

0

C或C++标准都没有定义这样的符号,所以你将会受到特定C或C++实现的支配。常用的符号列表将是一个有用的东西,但不幸的是我没有一个。

0

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

这是一个被libpng

0

的定义将是纯粹到你的编译器供应商所使用的。如果你在所有的平台上使用相同的编译器(比如说gcc),那么你就可以轻松一点。

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

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看看你能收集哪些类型的信息。)