Visual Studio 2010中格式化代码后引发的问题

在Visual Studio 2010中先选择一块代码区域,然后依次按快捷键 Ctrl+K, Ctrl+F 可以格式化代码。代码格式变得美观了,却有可能导致程序出错。举例如下:

在一个程序中有续行符 \ ,

Visual Studio 2010中格式化代码后引发的问题_第1张图片

在格式化前通过 WinHex 可以看到:


在续行符 \ 对应的 ASCII 码是 0x5C,下一个字节的 ASCII码值是 0x0A。0x0A 是 Unix 或 Linux 操作系统下的换行符。再下一个字节的 ASCII 码值是0x61,对应下一行的起始字符'a'。VS 2010能够正确识别 0x5C 0x0A 所代表的含义,程序在编译时没有特别的提示。

但是格式化以后,通过 WinxHex 看到:


续行符 \ 对应的 ASCII 码 0x5C 之后的字节值依次为 0x0D,0x0A,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x20,0x20,0x61 ...
0x0D 0x0A是 Windows下的回车符和换行符,VS 2010 在格式化代码时,不但把原始程序中的 0x0A 转换成 0x0D 0x0A,为了看起来对齐,还添加了 11 个制表符和 2 个空格,0x09 是 Horizontal tab (水平制表符)对应的 ASCII 码,0x20 是 Space (空格)对应的 ASCII 码。
VS 2010 能正确处理 0x5C 0x0D 0x0A,但是不能正确处理添加的 0x09 和 0x20。在编译程序时会出现一个提示:
warning C4045: “data_bin2ascii”: 数组界限溢出

为什么原先没问题的字符数组初始化过程竟会出问题呢?

这种错误靠眼睛很难看出来,原因就在于格式化代码引入多个的 0x09 和 0x20 被编译器当成了字符数组的元素,多出来的元素造成初始化时溢出了数组的边界。

从这个例子我们可以学到:最好不要使用 VS 2010 自带的代码格式化功能格式化包含续行符的程序语句。
也可以在格式化代码后手动删除在续行符后面添加的 0x09 和 0x20,但这需要 16 进制编辑器的辅助,仅靠眼睛是看不到这些特殊字符的。

你可能感兴趣的:(Visual Studio 2010中格式化代码后引发的问题)