您的位置:首页 > 其它

有关平台移植预编译命令的一些体会 _64选项

2011-10-17 14:43 387 查看
有关平台移植预编译命令的一些体会.

从下面一段代码开始:

Time.h 中的一段:

#ifndef _TIME_T_DEFINED

#ifdef _WIN64

typedef__int64 time_t; /* time value */

#else

typedef_W64long time_t; /* time value */

#endif

#define _TIME_T_DEFINED /* avoid multiple def's of time_t */

#endif

对于这些不熟悉的变量,我们一一熟悉:

首先应该了解Visual Studio环境下设置64位移植问题的选项,在“项目属性”-“C/C++”文件夹-“通用”-“检测64位可移植性问题”,有三个选项: 1否 2是 (WP/64) 3从项目默认设置继承。如果选择了2,那么程序中将进行相应的检测,查看是否有向64位移植的可能。

来看_W64,通过_W64来标记变量,使得在选中WP/64编译选项时,编译器将模拟64位编译器,报告所有64位编译器下可能出现的问题。所有用_W64来标记的变量,在x86系统中一定是32bits,在ia64系统下一定是64bits。_W64标识应该用在所有可能在32位到64位平台之间有所转换的typedef的地方。并且_W64将只出现在typedef的32bit定义中。

e.g.

#ifdef _WIN64

typedef unsigned __int64 size_t;

#else

typedef _W64 unsigned int size_t;

#endif

从上面可以看出,32位平台下,time_t被定义为long型数据类型的别名。

注意,在32位和64位系统之间转移代码时候,可能引起问题的类型只有三种:int,long, pointer。#define预编译命令不一定要给后面的变量定某个值,也可以只跟一个变量,而不指定值。这样,如果有#define FLAG 就是告诉编译器这个标记被定义,后面#ifdef FLAG就为真了。

顺便说一下,_WIN64宏即说明在64位平台条件下。_int64变量中前面的_说明是微软定义的扩展系统变量。

微软定义了_int8,_int16,_int32,_int64, 前三个分别对应ANSI定义的char,short,int类型,最后一个没有对应的ANSI类型。

__int8 nSmall; // Declares 8-bit integer

__int16 nMedium; // Declares 16-bit integer

__int32 nLarge; // Declares 32-bit integer

__int64 nHuge; // Declares 64-bit integer

下面再举一个例子:

// __w64.cpp

// compile with: /W3 /Wp64

typedef int Int_32;

#ifdef _WIN64

typedef __int64 Int_Native;

#else

typedef int __w64 Int_Native;

#endif

int main()

{

Int_32 i0 = 5;

Int_Native i1 = 10;

i0 = i1; // C4244 64-bit int assigned to 32-bit int

// char __w64 c; error, cannot use __w64 on char

}

从// char __w64 c; error, cannot use __w64 on char看出,_w64就是一个普通限定,可以用在普通变量定义中,这里,若是为int _w64 a;就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: