写代码时大家都会使用缩进(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和空格的更多相关文章

  1. 缩进, Tab 还是空格?(转)

    圣战 圣战个毛线 Android 好还是 iOS 好,Windows 好还是 Mac 好,编辑器好还是 IDE好,中划线好还是下划线好…写代码这么多年,会遇到很多奇葩的毫无意义的所谓脑残粉的争论 昨天 ...

  2. 写码时应该缩进使用 tab 还是空格?

    对于程序员来说,其实Tab和空格远远不只是“立场”问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格不会出现这个问题,因 ...

  3. 【Visual Studio】Tab 转换为空格的设置

    在 Visual Studio 中写代码时,按 Tab 键,会自动进行缩进.有时希望实现按 Tab 键,出现多个空格的效 果.Visual Studio 提供了这样的功能,具体设置方法为:打开 “To ...

  4. Sublime 将 Tab 转为空格

    最近在使用 vue-cli 搭建项目,但每次用 Hbuilder 编写 vue 文件的时候,如果存在<script>部分就会报错,错误信息大意是说空格有问题.仔细研究了之后才知道,这是因为 ...

  5. Visual Studio 中 Tab 转换为空格的设置

    Visual Studio 中 Tab 转换为空格的设置 在 Visual Studio 中写代码时,按 Tab 键,会自动进行缩进.有时希望实现按 Tab 键,出现多个空格的效果.Visual St ...

  6. Vim实用技巧系列 - tab和空格的转换

    有时候,我们会修改一些代码,而这些代码中的tab设定和我们自己的设定不一样.例如,我们自己的设定是以两个空格来代替tab,而要修改的代码则是使用tab.那么,我们应该怎样快速的将又有的tab转换为空格 ...

  7. Source Insight 4.0 文件类型、编码格式、tab转空格、tab键自动补全设置。。。

    1.编码格式  -- 在 Options->Preferences->Files 中的最下面,Default enconding 为 UTF-8 2.tab转空格 其他相关设置如下: 以下 ...

  8. vim 将tab转为空格

    在vimrc中添加以下选项 set expandtab 会将tab转换为空格,如果要输入一个tab则需要Ctrl-V<Tab>来实现 set tabstop= 会将tab转换为4个空格 使 ...

  9. Notepad++—显示代码对齐是使用了制表符还是空格

    使用Notepad++打开脚本,勾选"显示空格与制表符",此时你会看到代码对齐使用了制表符与空格 右箭头:TAB:空格:点: 参考:https://www.cnblogs.com/ ...

随机推荐

  1. enumerate()和map()函数用法

    一.python enumerate用法 先出一个题目: 1.有一 list= [1, 2, 3, 4, 5, 6] 请打印输出: 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输出 ...

  2. AppDomain.CurrentDomain.BaseDirectory是什么

    AppDomain.CurrentDomain.BaseDirectory 是获取基目录,它由程序集冲突解决程序用来探测程序集.由显示的路径可以看出,它代表的是程序集所在的目录,它具有读取和写入的属性 ...

  3. 浅谈MVVM模式和MVP模式——Vue.js向

    浅谈MVVM模式和MVP模式--Vue.js向 传统前端开发的MVP模式 MVP开发模式的理解过程 首先代码分为三层: model层(数据层), presenter层(控制层/业务逻辑相关) view ...

  4. 行转列之后的datagrid的保存

    行专列之后,查询的存储过程为 1 USE [APS_Future_FT] 2 GO 3 /****** Object: StoredProcedure [dbo].[P_APS_H_InternalS ...

  5. 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏

    Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...

  6. [转]Intent和PendingIntent的区别

    intent英文意思是意图,pending表示即将发生或来临的事情. PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. Int ...

  7. EntityFramework中几种操作小结

    目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. 列中加入RowVersion时间戳 public class Product ...

  8. BOOST Converter Analog/Digital Adjusted Output Voltage TPS61045 MAX1932

    DIGITALLY ADJUSTABLE BOOST CONVERTER The TPS61045 is a high frequency boost converter with digitally ...

  9. WinForm中DataGridView验证单元格输入的是数字

    转载:http://www.cnblogs.com/ganqiyin/archive/2013/02/18/2915491.html 事件:DataGridView验证单元格输入的是数字,DataGr ...

  10. .Net4.0并行库介绍——Cancellation Framework

    在.net 4.0中,引入了一个新的类CancellationToken,这个类基本上集成了我们各种常用的取消方式,在并发任务中非常有用. 同步模式下的取消: 一种比较常见的需要支持取消功能的的是一些 ...