缩进与对齐——正确地使用Tab和空格
写代码时大家都会使用缩进(indentation)和对齐(alignment),这是两个相关而又不同的概念,两者都是为了提高代码的可读性。缩进出现在一行的最左边,目的是明显地区分开包含与被包含的代码;对齐则是为了使代码美观、整洁。
下例中,类的两个成员变量相对于类名来说具有一级缩进;两个变量的注释部分采用了对齐显示。它使用了Tab(假设一个Tab等于8个空格的大小)来缩进和对齐,一块绿色表示一个Tab。

同样的代码,在另一个开发人员的机器上(一个Tab等于4个空格的大小)打开可能就不再对齐:

造成这一现象的原因是代码的对齐使用了Tab,而不同编辑器的Tab键大小设置不一样。因此下一个Tab stop的位置可能发生变化,导致代码不对齐。如果使用空格代替Tab,就不会有这个问题,因为空格的数量是不会变化的。
下面以Visual Studio 2008为例,来说明如何正确地设置Tab到空格的转换。
在Visual Studio 2008中可以按快捷键 [CTRL] +[R] +[W] 来显示原先不可见的字符如Tab和空格,这样可以时刻提醒自己在需要对齐的地方不要用Tab。下图中,向右的箭头表示Tab,小点表示空格。(Tab size=8, Indent size=4,下面有具体解释)

在Visual Studio中可以设定Tab和缩进的大小(单位是空格):工具->选项->文本编辑器->C/C++->Tabs。记得要把“插入空格”选上,这样所有新产生的Tab都会自动转换成对应的空格数(下图中为8)来代替Tab。需要特别说明的一点是,原先已经存在的Tab并不会因为该选项而自动转换成空格。

如果选了“插入空格”,上面的代码在编译器中显示为:

这样的代码,无论在哪个编辑器中都是对齐的。
保持Tab(Keep Tabs)
需要详细说说VS中”保持Tab“这个选项。即使你选了这个选项,也不意味着每次按下Tab键都会插入一个Tab字符( ASCII0x09)。实际上,按下Tab后只是向右边移动Indent size个空格(上例中为4)。只有当移动以后的位置刚好处在一个物理Tab边界(即Tab size的整数倍)时,编辑器才会插入Tab而不是几个空格。仔细想想,这是可以理解的。
总结
代码的对齐必须使用空格而非Tab,因为后者在不同编辑器中的大小可能是不一样的,容易导致代码在其他机器上不再对齐。
参考
1. 这篇文章讨论了为什么要用空格来对齐:Tab-size independent source code formatting
2. Noah Richards回答了提问者关于按下Tab键后右移格数的问题:cannot get the tab size to be different than the indent size
缩进与对齐——正确地使用Tab和空格的更多相关文章
- 缩进, Tab 还是空格?(转)
圣战 圣战个毛线 Android 好还是 iOS 好,Windows 好还是 Mac 好,编辑器好还是 IDE好,中划线好还是下划线好…写代码这么多年,会遇到很多奇葩的毫无意义的所谓脑残粉的争论 昨天 ...
- 写码时应该缩进使用 tab 还是空格?
对于程序员来说,其实Tab和空格远远不只是“立场”问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格不会出现这个问题,因 ...
- 【Visual Studio】Tab 转换为空格的设置
在 Visual Studio 中写代码时,按 Tab 键,会自动进行缩进.有时希望实现按 Tab 键,出现多个空格的效 果.Visual Studio 提供了这样的功能,具体设置方法为:打开 “To ...
- Sublime 将 Tab 转为空格
最近在使用 vue-cli 搭建项目,但每次用 Hbuilder 编写 vue 文件的时候,如果存在<script>部分就会报错,错误信息大意是说空格有问题.仔细研究了之后才知道,这是因为 ...
- Visual Studio 中 Tab 转换为空格的设置
Visual Studio 中 Tab 转换为空格的设置 在 Visual Studio 中写代码时,按 Tab 键,会自动进行缩进.有时希望实现按 Tab 键,出现多个空格的效果.Visual St ...
- Vim实用技巧系列 - tab和空格的转换
有时候,我们会修改一些代码,而这些代码中的tab设定和我们自己的设定不一样.例如,我们自己的设定是以两个空格来代替tab,而要修改的代码则是使用tab.那么,我们应该怎样快速的将又有的tab转换为空格 ...
- Source Insight 4.0 文件类型、编码格式、tab转空格、tab键自动补全设置。。。
1.编码格式 -- 在 Options->Preferences->Files 中的最下面,Default enconding 为 UTF-8 2.tab转空格 其他相关设置如下: 以下 ...
- vim 将tab转为空格
在vimrc中添加以下选项 set expandtab 会将tab转换为空格,如果要输入一个tab则需要Ctrl-V<Tab>来实现 set tabstop= 会将tab转换为4个空格 使 ...
- Notepad++—显示代码对齐是使用了制表符还是空格
使用Notepad++打开脚本,勾选"显示空格与制表符",此时你会看到代码对齐使用了制表符与空格 右箭头:TAB:空格:点: 参考:https://www.cnblogs.com/ ...
随机推荐
- enumerate()和map()函数用法
一.python enumerate用法 先出一个题目: 1.有一 list= [1, 2, 3, 4, 5, 6] 请打印输出: 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输出 ...
- AppDomain.CurrentDomain.BaseDirectory是什么
AppDomain.CurrentDomain.BaseDirectory 是获取基目录,它由程序集冲突解决程序用来探测程序集.由显示的路径可以看出,它代表的是程序集所在的目录,它具有读取和写入的属性 ...
- 浅谈MVVM模式和MVP模式——Vue.js向
浅谈MVVM模式和MVP模式--Vue.js向 传统前端开发的MVP模式 MVP开发模式的理解过程 首先代码分为三层: model层(数据层), presenter层(控制层/业务逻辑相关) view ...
- 行转列之后的datagrid的保存
行专列之后,查询的存储过程为 1 USE [APS_Future_FT] 2 GO 3 /****** Object: StoredProcedure [dbo].[P_APS_H_InternalS ...
- 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏
Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...
- [转]Intent和PendingIntent的区别
intent英文意思是意图,pending表示即将发生或来临的事情. PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. Int ...
- EntityFramework中几种操作小结
目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. 列中加入RowVersion时间戳 public class Product ...
- BOOST Converter Analog/Digital Adjusted Output Voltage TPS61045 MAX1932
DIGITALLY ADJUSTABLE BOOST CONVERTER The TPS61045 is a high frequency boost converter with digitally ...
- WinForm中DataGridView验证单元格输入的是数字
转载:http://www.cnblogs.com/ganqiyin/archive/2013/02/18/2915491.html 事件:DataGridView验证单元格输入的是数字,DataGr ...
- .Net4.0并行库介绍——Cancellation Framework
在.net 4.0中,引入了一个新的类CancellationToken,这个类基本上集成了我们各种常用的取消方式,在并发任务中非常有用. 同步模式下的取消: 一种比较常见的需要支持取消功能的的是一些 ...