Visual C++可移植性报告
acmilan2015/11/29软件综合 IP:四川
Visual C++的特点:
窄字符只支持单字节编码(如1252/437)和双字节编码(如GBK),不支持UTF-8
增加了很多宽字符函数,比如_wfopen,wmain,只有使用这些函数才能兼容Unicode
当年16位/Win9x编程需要使用GBK等双字节编码,为了正确处理这种编码,添加了一些MBCS函数,如_mbscpy、_mbsstr等
为了16位/Win9x与WinNT移植方便,添加了通用字符类型TCHAR和通用函数宏定义如_tfopen,写一套代码就可以生成两个版本的程序
POSIX函数大多有下划线前缀,如_creat
针对Windows系统和编程的方便性添加了很多增强函数,如_chdrive,_getdcwd,_strrev等
对文本的处理要转换换行符,并且有UNICODE/UTF-8/UTF-16LE模式

POSIX程序移植到Visual C++,会发现的问题:
1.不支持Unicode和UTF-8,只能支持系统默认的单字节/双字节编码,然而经常无法正确处理双字节编码
2.需给POSIX函数添加下划线,如creat变为_creat
3.很多POSIX函数无法使用(如fork),需更新代码

Visual C++程序移植到POSIX也会有困难:
A. 程序不使用Unicode:可能可移植,移植后支持UTF-8,需改POSIX函数名,有些函数(如_getdcwd)无法使用
B. 程序使用Unicode:大多数情况下不可移植
C. 程序使用MBCS:不可移植
D. 程序使用TCHAR:可能可移植,移植后支持UTF-8,需重新编写tchar.h,需改POSIX函数名,有些函数(如_getdcwd)无法使用

编写Windows/Linux可移植程序比较现实的方法:
1. 使用Cygwin
2. 使用Java
3. 使用Qt (限图形界面)
4. 使用Python
5. 使用.NET Core/Mono-Xamarin (可能只有文本界面)

不推荐使用MinGW编译器,因为它是把一个POSIX C++编译器嫁接到了VC++ Runtime上。

如果想使用Visual C++,就不要追求可移植性了,因为可移植的都是古代部分,现代部分根本就不可移植。

[修改于 8年6个月前 - 2015/11/29 20:24:49]

来自:计算机科学 / 软件综合
8
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
金星凌日
8年6个月前 IP:陕西
799053
事实上很多情况下MinGW已经够了(因为值得移植的程序通常不会包含太多与系统结合紧密的部分,完全可以使用条件编译来支持不同平台),此时Cygwin中完整的POSIX反而成了累赘。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
799054
引用 金星凌日:
事实上很多情况下MinGW已经够了(因为值得移植的程序通常不会包含太多与系统结合紧密的部分,完全可以使用条件编译来支持不同平台),此时Cygwin中完整的POSIX反而成了累赘。
事实上用MinGW做移植和用VC++直接做移植是一样的效果。。。因为MinGW是基于MSVCRT的。。。
条件编译多了不利于管理,编程起来也相当麻烦,从实用性的角度来说,直接使用原生C/C++跨平台不是一个好选择。。。
通常使用Cygwin/Java/Qt/Python/.NET Core等可以把平台差异隐藏起来的编程方法会更方便。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金星凌日
8年6个月前 IP:陕西
799059
引用 acmilan:
事实上用MinGW做移植和用VC++直接做移植是一样的效果。。。因为MinGW是基于MSVCRT的。。。
条件编译多了不利于管理,编程起来也相当麻烦,从实用性的角度来说,直接使用原生C/C++跨平台不是一个好选择。。。
通常使用Cygw...
如果只考虑编译器,那你说的还算比较正确。但问题在于,可移植程序需要的不仅仅是一个编译器,而是完整的工具链。
MinGW通常会与MSYS一起使用,因而可以直接用开源软件中常见的automake,而VC++就不行。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
799061
引用 金星凌日:
如果只考虑编译器,那你说的还算比较正确。但问题在于,可移植程序需要的不仅仅是一个编译器,而是完整的工具链。
MinGW通常会与MSYS一起使用,因而可以直接用开源软件中常见的automake,而VC++就不行。
然而可以同时支持automake、msbuild、cmake等多种构建工具,支持不同工具链也是条件编译的一个方面。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
8年6个月前 IP:山东
799115
引用 acmilan:
然而可以同时支持automake、msbuild、cmake等多种构建工具,支持不同工具链也是条件编译的一个方面。。。
Mono只是某些跟系统关系太深的控件不能用 比如webbrowser
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
799118
引用 张静茹:
Mono只是某些跟系统关系太深的控件不能用 比如webbrowser
Mono的Windows Forms是用什么技术支持的?
WPF好像需要DirectX支持,一直没有移植过去,XAML的只有Silverlight可以使用。。。
.NET Core好像是只有文本界面的,轻量级可移植,并不是像Mono那样完整复制.NET框架。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
8年6个月前 IP:山东
799121
引用 acmilan:
Mono的Windows Forms是用什么技术支持的?
WPF好像需要DirectX支持,一直没有移植过去,XAML的只有Silverlight可以使用。。。
.NET Core好像是只有文本界面的,轻量级可移植,并不是像Mono那样...
不知道,我在windows下用.net写的exe,拖到已经装了mono环境的Ubuntu系统中 直接就能运行,
我爱死.net了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
799140
引用 张静茹:
不知道,我在windows下用.net写的exe,拖到已经装了mono环境的Ubuntu系统中 直接就能运行,
我爱死.net了
.net core好像有两种运行方式,一种是使用dxe直接运行源代码,另一种是先编译为dll再用consolehost间接执行。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年3个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}