缩进之争:Tab 还是空格?
在开发者中间,关于代码缩进时使用Tab还是空格的争论一直存在。“Tab派”认为Tab在语义上更适合缩进,更具定制性,并且对于视觉障碍者来说更加友好。他们建议使用Tab来进行缩进,而空格则用于对齐。“空格派”则强调一致性,因为无论在哪种编辑器或平台上,空格都能确保代码格式的一致性,从而避免了不同Tab宽度带来的问题。这种一致性在团队环境中尤为重要,以保持代码外观的一致性。
但是,如果你在C语言编程中需要使用Makefile,那么你就没有选择——你必须使用“Tab”。
一、Makefile 中 Tab 的要求
在Makefile中要求使用Tab的规定源自Unix开发者Stuart Feldman,他是‘make’工具的创造者。Feldman选择使用Tab是为了帮助区分Makefile中的命令和其他文本。具体来说,在早期的‘make’实现中所使用的Lex解析器难以区分Tab和空格,这导致了必须使用Tab的要求。尽管Feldman后来承认这是一个次优的选择,但这一约定依然沿用了下来。
图片描述
上述截图展示了一个Makefile。在这个例子中,使用了notepad++的“显示符号”功能,这样就可以清晰地区分Tab和空格——图中的箭头指示第8行、第12行和第16行使用了Tab。如果你使用空格代替Tab来缩进这些行,程序将无法运行——你会收到一个错误:
Makefile:line_number: *** missing separator. Stop.
二、Tab 与空格的优劣比较
Tab 的优势
-
语义正确:Tab在语法上代表了缩进,而不是字符。 -
可定制性:用户可以根据自己的喜好调整Tab的宽度。 -
无障碍性:对于视力受损的人来说,Tab比连续的空格更容易识别。
空格的优势
-
一致性:所有编辑器都会以相同的方式显示空格,这使得代码看起来一致。 -
易读性:空格不会引起因Tab宽度不同而导致的代码错位。
三、Makefile 中 Tab 的重要性
由于Makefile的特殊性,Tab在这里起到了命令与文本的分隔作用。Make工具依赖Tab来识别规则中的目标和依赖项。这意味着在Makefile中,任何不使用Tab的地方都可能导致解析错误。
四、示例
假设我们需要创建一个简单的Makefile来编译一个C程序。我们将使用Tab来分隔目标和依赖项:
# Makefile 示例
# 使用Tab来分隔目标和依赖项
# 编译规则
all:\t# 使用Tab来分隔
\tgcc -o hello hello.c
clean:\t# 使用Tab来分隔
\t# 清理生成的可执行文件
\trm -f hello
实现的功能或目的
此Makefile的目的是编译一个简单的C程序hello.c
,并在清理时移除生成的可执行文件hello
。
解决方案
-
使用 all:
作为目标。 -
使用 gcc
编译器将hello.c
编译成hello
。 -
使用 clean:
作为清理目标,移除hello
文件。
效果
当你运行make
命令时,Make工具会编译hello.c
,生成hello
可执行文件。当你运行make clean
时,hello
文件会被删除。
五、结论
-
在代码缩进的选择上,Tab和空格各有优势,取决于个人或团队的需求。 -
对于Makefile而言,由于历史和技术原因,必须使用Tab来分隔命令和依赖项,以保证Make工具能正确解析Makefile。