微软C/C++编译器中管理字符集的新选项

[原文发表地址] New Options for Managing Character Sets in the Microsoft C/C++ Compiler [原文发表时间] 2016/2/22 微软C/C++编译器在伴随着DOS操作系统, 16位windows操作系统和32/64位windows操作系统发展的同时,也在支持不同着字符集、代码页和编码。这篇文章不仅解释了过去我们的编译器是怎样工作的,而且还包含Visual Studio 2015 Update 2 CTP C/C++编译器中提供的一些新的编译选项开关,明确支持BOM-less UTF-8文件和控制执行字符集,请下载并试用它。关于Update 2中的编译器的其他改变可以查看这篇文章。 有一些非常好的在线资源很详细的描述了Unicode, DBCS, MSCS,代码页和其他相关知识,我不会尝试在这里重现它们,但我们会很快涵盖这些基本概念。The Unicode Consortium是一个学习Unicode编码非常好的网站。 我们主要会通过两个方面来让大家明白我们的编译器是怎样来处理不同的字符集的。第一个方面是如何解释源文件(源字符集)里的字节,第二个方面是它把什么字节写入二进制(执行字符集)。弄明白源代码在磁盘上是怎样编译和存储是非常重要的。 显式标记 Unicode编码 通过BOM(字节序标记)来标记Unicode文件是一种标准方式,BOM不仅能标记UTF-32、UTF-16和UTF-8,也可以判断它是否有高字节序和低字节序。通过BOM来表明字节的序列, 这些结果来自于从编码U+FEFF到任何正在使用的编码。UTF-8是一种字节流编码,所以实际上并没有排序字节需要被标记出来,但是UTF-8的标志通常仍然被叫做“BOM”。 隐式标记 Unicode编码 在支持Unicode之前的Windows(和DOS)操作系统, 其文本文件以没有迹象显示编码形式来存储,它是由应用程序来诠释的。在DOS中,ASCII范围外的任何字符都将被构建成视频卡来输出。在Windows中,这个被称为OEM(437)代码页,它包含一些非英文字符集,以及一些用于绘制文本周围框线的字符集。 Windows最终还是添加了对DBCS (双字节字符集) 和MBCS (多字节字符集) 的支持。至今仍然没有一个标准的方式来表示文本文件的编码是什么,无论系统代码页如何设置字节通常会被解释。当32位的Windows出现时,它为了UTF-16分割APIs或者设置另外的所谓的“ANSI”APIs,这些APIs用8个字节来表示当前文件中的Unicode编码。 注意:通常你是不能在Windows中设置系统代码页为Unicode代码页(或者UTF-16 和UTF-8), 所以在很多情况下,在一个老的应用程序中去来弄明白没有BOM的 Unicode编码,并不是一件容易的事情。 这也是现在常见的在UTF-8中不使用BOM的编码,大部分Linux环境下默认是这样的。虽然很多的Linux工具可以处理BOM, 但大部分工具却不能生成它。实际上没有BOM,很多简单的事情例如连接和追加文件也不用担心谁来写BOM。 怎样用微软C/C++编译器从一个文件中读取文本 在过去的某一时刻,微软编译器内部改用了UTF-8字符集。 所以,从磁盘上读取文件时会转换成UTF-8字符集。如果一个文件中有BOM,我们可以使用并读取指定的任意编码的文件并把它转换到UTF-8。如果一个文件中没有BOM,我们可以尝试通过看前8个字节来删除UTF-16编码中的低字节序和高字节序。如果这个文件看起来像UTF-16, 我们将把它当作一个包含UTF-16字节序标记的文件来处理。 如果没有字节序标记,而且它看起来也不像UTF-16, 那么我们可以用当前的代码页(调用GetACP的结果)来把磁盘上的字节转换成UTF-8。这个是否正确取决于文件中实际的编码是怎样的以及包含什么字符。如果文件中实际包含的是UTF-8编码,它将不能被识别为正确的系统代码页,不能被设置为CP_UTF8。…

0

VS2015 update 1: 新功能 – MPX

[原文发表地址] Visual Studio 2015 Update 1: New Experimental Feature – MPX [原文发表时间] 2016/1/20 10:00AM 导论: 这篇文章是关于在VS2015中支持Intel®内存保护扩展(Intel® MPX),文章的内容是由Intel公司的Gautham Beeraka, George Kuan,和Juan Rodriguez提供的。 概述: VS2015 update 1 于2015年11月30日发布, 在这个更新版本中包含了对Intel MPX编译和调试功能的支持。Intel MAX能够检查所有指针的读取和写入,以确保它们在已声明的内存范围内。这个技术可以检测缓存区的溢出,并且停止正在运行的程序以避免危及系统。它允许C/C++代码使用第六代 Intel 酷睿处理器(启用MPX的 平台) 中介绍的最新的MPX 指令集和寄存器。 微软Visual C++编译器和链接器现在有通过特定的命令行选项启动自动检测的能力。 这篇博客解释了你该如何使用MPX代码自动生成以及启用MPX调试二进制文件。如果你想了解更多的有关Intel MPX的信息,请查看Intel MPX Technology web page. 如何来启用MPX代码的自动生成功能 VS2015 Update 1 有一个新的编译选项: /d2MPX. /d2MPX当前支持: 检查写入内存时的潜在缓存溢出, 它可以保护本地的和公用的指针和数组。 扩展到函数调用来自动提示指针参数的边界。 在你的工程中启用MPX的代码自动生成功能: 在VS中,如图1所示在添加其他选项框(项目|属性|配置属性|C/C++|命令行|其他选项)中添加/d2MPX编译选项。 图1:添加…

0

Clang with Microsoft CodeGen 2016年1月)发布上线

[原文发表地址]Clang with Microsoft CodeGen (January 2016) released [原文发表时间]2016/1/21 2:34 AM 我们已经发布了一个带外的Clang/C2工具集,它包含了一些社区问题的修复和测试中发现的bugs。这是未来即将快速发布众多版本中的一个,来自用户的一些问题反馈会逐渐处理。这里我们只列出相较于之前版本的新变化, 更多关于Clang/C2工具的详细讨论,请参阅VS2015.1的Microsoft CodeGen in VS 2015 1。 这个更新仍然是基于Clang3.7的一些相关优选的社区问题修复,并且将C2.dll的版本修改为19.023413.0。 Microsoft Fixes 修复原子布尔类型std::atomic_flag,使其生成正确的静态代码. 修复了”Static Library for Universal Windows”模板在目标平台为ARM时,使用Clang/C2工具集的问题。 修复了Clang/C2 和Android MDD同时安装,共享的Clang编译器的目标定义文件被重写的问题。 改变了当从工具集Visual studio 2015(v140)切换到Clang/C2的一些默认参数, 使其更好的兼容新工具集(EH开启异常捕捉模式, PCH预定义头文件默认关闭)。 Community Fixes r254346 [PR25661]根据r254323, 恢复部分一部分r217213。 r254323 [MS Compat]在推演模板参数时,调整了之前的调用机制thiscall, 变为新的调用机制cdecl。 r253843 [MS ABI] 允许调用__RTDynamicCast。 r253523 [MS ABI] 让arbitrary entities加入 vftable的排列 r253013 [Sema]…

0

VS 2015 Update 1 中带微软代码生成的Clang

[原文发表地址]Clang with Microsoft CodeGen in VS 2015 Update 1 [原文发表时间] 2015/12/4 7:17 PM [这篇博客的作者是Dave Bartolomeo 和Clang/C2 团队的组员] 在开发和维护跨平台C++代码方面,其中一个改变就是针对不同平台的不同编译器的问题。 你写的一些针对Windows平台的代码,用Visual C++编译器可以编译成功,但那时你针对安卓平台的编译就会失败,那是因为Clang的标准规格更为严格,你的代码恰好是按照比较宽容的Visual C++编写的。又或者你针对iOS用了一些新的代码,Clang可以编译成功,但是才发现这些新的C++语言,Visual C++是还无法支持的,你只能想办法重新实现这个方法而不用这个新的语言特性,或者生成一个单独的能够用Visual C++编译的Windows实现方式。 为了能够更加方便的进行跨平台代码的开发,使在Windows 和其他平台更好的工作, 我们为Visual Studio单独发布了一个额外的编译工具集, 叫带微软代码生成的Clang编译器。这个编译器为C语言和C++语言使用开源的Clang解析,还有Visual C++ 编译工具的代码生成器和优化器。像对其他平台一样,你可以为Windows使用相同的Clang解析你的跨平台代码,还能够充分利用Visual C++优化器先进的优化功能。因为针对非Windows平台,新的工具也使用的是一样的Clang解析,你不需要在代码里写满令人讨厌的#ifdefs,只需要为不同的编译器说明下即可。同时你的代码中可以使用那些还没有被Visual C++ 编译器所支持的语言特性, 包括C99 复杂类型和C++ 14 扩展的constexpr的支持。因为基于Clang的编译器会长生和Visual C++编译器一样格式的调试的信息,所以你能感受到同样很棒的Visual Studio 调试器体验。 用新的编译工具所编译的代码能够和Visual C++ 2015 C和C++编译器所编译的其他代码相链接。通常,你可以使用带微软代码生成的Clang编译器来编译跨平台代码,用普通的Visual C++ 工具集来编译特定的Windows代码(例如,你的UI)。 请注意,带微软代码生成的Clang编译器现在是一个预览功能。 我们知道在很多方面它还不够完善,仍存在一些漏洞。我们希望你可以尝试使用这个新功能,明白它如在应用在你的代码工作上,并给我们反馈。 安装 在Visual Studio 2015 Update 1中,Visual Studio安装时开始进行功能选择时的UI界面,你会看到在“跨平台和手机开发\Visual…

0