我有一个使用 wxWidgets 的 C++ 应用程序。应用程序的某些部分因 32 位和 64 位主机而异。目前我使用 sizeof(void *),但是有没有更好的方法来使用条件编译并且是平台中立的?
4 回答
通常人们使用#defines 来确定位数(确切的定义将取决于编译器)。这比使用 sizeof(void*) 的运行时方法要好。
至于平台中立,一些编译器在多个平台上。
根据您的编译器,您可能有权访问特定于平台的宏。尝试查找他们的文档。
所有常见的编译器都有预定义的识别平台的预处理器宏。例如,如果您使用的是 GCC,您可以轻松地检查它们:
touch foo.h; g++ -E -dM foo.h
其中产生
#define linux 1
#define __x86_64 1
对我来说,因为我目前使用的是 64b linux,并且
#define __APPLE__ 1
#define __i386 1
在 32b OS X 上,我听说了。
对于 Sun Studio 12,它们在此处记录。此外,Sun Microsystems 将它们视为编译器 API 的一部分,因此确保了兼容性。例如,在我的 Solaris 机器上,我__SunOS_5_10
定义了__sparcv9
(暗示 64b)。
在带有 IBM xlc 编译器的 AIX 系统上,查看/etc/vac.cfg
其options
关键字字段以找出预定义的宏。在我有权访问的系统上定义了至少_AIX
和更具体_AIX61
的以及(在 64b PPC 上)。_POWER
在 HP-UX 及其 aCC 编译器上,至少有__ia64
itanium 上的宏。此处记录了其他一些特定于 aCC 的预定义宏。
What's wrong with using sizeof()
where the size matters? The compiler will happily optimise it away to a constant.