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版本.
我将通过最大指针值常量间接测试它:
#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)
通过这种方式,您不依赖于任何特定于平台的架构定义,而是依赖于具有特定架构的直接结果 - 指针大小。
您可以检查一个众所周知的类型,例如32位平台的sizeof(int *)== 4。
由于sizeof在编译时是已知的,我相信
if(sizeof(int*) == 4)
{
...
}
Run Code Online (Sandbox Code Playgroud)
应该做到的
编辑:注释是正确的,您需要使用常规if,#if无法正常工作。
如果您使用的是C ++,则可以创建模板代码,然后让编译器根据sizeof()调用为您选择特殊化。如果为32位平台构建,则编译器将仅实例化32位平台的代码。如果为654位平台构建,则编译器将仅实例化64位平台的代码。
| 归档时间: |
|
| 查看次数: |
26161 次 |
| 最近记录: |