有关平台移植预编译命令的一些体会 _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;就可以了。
从下面一段代码开始:
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;就可以了。
相关文章推荐
- MTK平台,当修改一些代码时,使用什么编译命令可以最有效率
- linux 7z命令交叉编译移植到arm linux平台
- MTK平台,当修改一些代码时,使用什么编译命令可以最有效率
- CC编译的一些命令选项
- linux64平台上编译32位程序: GCC编译选项 -m64 -m32 -mx32
- 有关Windows平台下Hook一些系统API技术方案的考虑
- x264之c64x+平台移植(二):arm端应用程序编译
- Makefile之 cc编译命令选项
- Android 编译命令及选项(转)
- 【小松教你手游开发】【unity实用技能】unity游戏移植到WindowsPhone8平台上的一些
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
- linux下和apache有关的操作命令:配置-编译-安装-及其它
- 深入浅出 - Android系统移植与平台开发(四)- 搭建Linux编译环境
- 64位平台编译常见问题汇总(个人移植问题仅供参考)
- 当修改一些代码时,使用什么编译命令可以最有效率
- CMAKE的一些编译选项 -lpthread
- qt-5.6.0 移植之qt源码编译-configure选项
- 个人备注的一些编译调试命令
- vim:一些命令和选项 filetype, autocmd, map,tabstop等
- android平台的几个编译命令----make,mmm,mm,mma