2012-04-19 85 views
0

正如我在很多问题中所解释的,我试图将软件从32位系统移动到64位系统。 我有some problem with malloc() function,但现在我通过更正参数来解决它。C++函数检查软件是否在32位或64位系统上运行

在我的代码的一部分,如果我在32位系统上运行,我可以使用:

(INT **)malloc的(常量*的sizeof(int)的)

但是,在64位系统上,我必须使用:

(INT **)malloc的(常量*的sizeof(的int64_t))

我想要一个如果()条件来管理这些十字路口,所以我需要一个布尔isIt64system()函数的行为是这样的:

如果(isIt64system()),然后[64比特码]

别的[32位代码]

这是否功能在C++存在吗? 是否有任何函数告诉我软件是否在32位系统或64位系统上运行?

+0

那么你的意思是说你在两个不同的平台上运行相同的二进制文件? – Matt 2012-04-19 12:31:32

+1

[在C++中确定32位和64位]可能的重复(http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c) – Anonymous 2012-04-19 12:33:43

+3

正确的方法是' (int **)malloc(count * sizeof(int *))'或甚至更好'new int * [count]'。 – Henrik 2012-04-19 12:33:59

回答

5

而不是写两个尺寸依赖的分支,只写一个正确的,可移植的代码路径。你的情况:

(int**)malloc(count*sizeof(int*)); 

这将正常工作,无论int* sizeof运算的系统上。


后记:正如你可以从这个字面回答你的问题看,你断不能有一个更好,如果:

if(sizeof(int*) == sizeof(int)) 
    x = (int**)malloc(count*sizeof(int)); 
else if (sizeof(int*) == sizeof(int64_t)) 
    x = (int**)malloc(count*sizeof(int64_t)); 

希望你可以看到,代码是多么荒谬多余的,以及它如何应该由一个精心构造的malloc呼叫代替。

+0

谢谢。其他解决方案'新的int * [count]'是否一样? – 2012-04-19 13:48:49

+1

该解决方案也是正确的,并且对于C++程序更合适。注意,任何分配'new []'的指针都必须用'delete []'释放,任何分配了'malloc()'的指针都必须用'free()'释放。 – 2012-04-19 13:59:23

1

你的编译器将有预处理器定义,它可以让你检查32bit与64bit。

0

最好是使用这样的

#ifdef __LP64__ 
    <64bit code> 
#else 
    <32bit code> 
#endif 

但如果你真的需要一个功能,它那么这应该工作。

bool is64bit() { 
    if (sizeof(int*) == 4) { 
     return false; 
    } 
    return true; 
} 
相关问题