常见的方式:
1.根据宏来进行区分
// check win
#if _WIN32 || _WIN64
#if _WIN64
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
// check GCC
#if __GNUC__
#if __x86_64__ || __ppc64__
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
2.size of pointer 通常情况下,在32位平台上一个指针的宽度为4bytes,而在64位平台上位8bytes.
#if sizeof(char *) == 8
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
3.如果不允许使用sizeof 根据栈指针变量宽度来判断,对指针变量地址相减时,须将其转换为char*,否则相减的结果为1。表示地址间隔 内存放元素的个数。代码如下:
std::string getPlatform()
{
void \*a;
void \*b;
int size = (char \*)&a - (char \*)&b;
if(size == 8) return "64bits"
else return "32bits"
}
在32位和64位平台上,对于数据类型除了指针的宽度不一样之外,还有其它类型也会有差别。比如整型:
C ++标准未指定整数类型的大小(以字节为单位),但指定了它们必须能够容纳的最小范围。
可以在<limits.h>
in C, or <climits>
in C++ (or even better, templated std::numeric\_limits
in <limits>
header).查询实际的类型范围.
//C:
#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;
//C++:
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
所以可以通过整数类型的大小范围来区别32还是64位,带入如下:
#include <cstdint>
#if INTPTR_MAX == INT32_MAX
#define THIS_IS_32_BIT_ENVIRONMENT
#elif INTPTR_MAX == INT64_MAX
#define THIS_IS_64_BIT_ENVIRONMENT
#else
#error "Environment not 32 or 64-bit."
#endif
另外对于32bits和64bits的函数可以采用如下模板形式,而不是宏的形式:
template<int> void DoMyOperationHelper();
template<> void DoMyOperationHelper<4>()
{
// do 32-bits operations
}
template<> void DoMyOperationHelper<8>()
{
// do 64-bits operations
}
// helper function just to hide clumsy syntax
inline void DoMyOperation() { DoMyOperationHelper<sizeof(size_t)>(); }
int main()
{
// appropriate function will be selected at compile time
DoMyOperation();
return 0;
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。