#ifdef用于32位平台

vee*_*efu 21 c c++ 64-bit gcc 32-bit

在我维护的应用程序中,我们遇到了影响stdlib的文件描述符限制的问题.此问题仅影响标准库的32位版本.

我已经设计了一个修复我的代码,并希望实现它,但只有在编译32位可执行文件时.我可以#ifdef使用什么预处理器符号来确定是为32位还是64位目标编译代码?

编辑

对不起,没提,代码是跨平台,linux,windows,solaris和其他一些unix风格,大多使用GCC进行编译.我可以跨平台使用任何事实上的标准吗?

编辑2

我发现了一些似乎可能有用的定义"__ILP23"和"__LP64"... 这里的讨论解释了unix平台的背景.任何人都有使用这些定义的经验吗?这会有用吗?

Jar*_*Par 16

我不确定是否有适合的通用#if def.C++标准几乎肯定没有定义一个.虽然有一些平台的spcefic.

例如,Windows

#if _WIN64 
// 64 bit build
#else
// 32 bit build
#endif
Run Code Online (Sandbox Code Playgroud)

EDIT OP提到这是使用GCC和其他编译器在Windows和非Windows之间进行交叉编译

没有可用于所有平台和编译器的通用宏.一点点的预处理器魔术可以做到这一点.假设您只使用x86和amd64芯片,以下应该可以解决问题.但是,它可以很容易地扩展到其他平台

#if _WIN64 || __amd64__
#define PORTABLE_64_BIT
#else
#define PORTABLE_32_BIT
#endif
Run Code Online (Sandbox Code Playgroud)


Chr*_*utz 15

我建议为predef SourceForge添加书签.没有一个答案,但它肯定可以帮助你开始.

编辑:对于仅GCC代码,您可以使用__i386__检查32位x86芯片,我建议尝试__X86_64__或类似的东西检查64位x86芯片.(注意:我注意到之前的答案__ia86__实际上是一个不同的芯片,而不是64位x86芯片.这只是表明我缺乏硬件经验.对于那些比我更了解硬件的人,请使用SourceForge页面在我链接到上面的预定义宏上.它比我更准确.)还有一些其他的可行,但这两个应该是相当普遍的GCC版本.

  • 作为另一个提示,您可以运行`gcc -E -dM - </ dev/null`(或者离开`</ dev/null`并在按Enter键后输入EOF),GCC将吐出一个列表它预先定义的所有宏.在几个平台上执行此操作,并为每个平台编译唯一且有用的列表. (3认同)

dra*_*oot 6

我将通过最大指针值常量间接测试它:

#include <stdint.h>

#if UINTPTR_MAX == 0xffFFffFF
// 32-bit platform
#elif UINTPTR_MAX == 0xffFFffFFffFFffFF
// 64-bit platform
#else
#error Unknown platform - does not look either like 32-bit or 64-bit
#endif
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您不依赖于任何特定于平台的架构定义,而是依赖于具有特定架构的直接结果 - 指针大小。


lot*_*har 5

您可以检查一个众所周知的类型,例如32位平台的sizeof(int *)== 4。

由于sizeof在编译时是已知的,我相信

if(sizeof(int*) == 4)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

应该做到的

编辑:注释是正确的,您需要使用常规if,#if无法正常工作。

如果您使用的是C ++,则可以创建模板代码,然后让编译器根据sizeof()调用为您选择特殊化。如果为32位平台构建,则编译器将仅实例化32位平台的代码。如果为654位平台构建,则编译器将仅实例化64位平台的代码。