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++,就不要追求可移植性了,因为可移植的都是古代部分,现代部分根本就不可移植。
200字以内,仅用于支线交流,主线讨论请采用回复功能。