本节书摘来自华章计算机《c语言编程魔法书:基于c11标准》一书中的第1章,第1.4节,作者: 陈轶 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
gnu是一款能用于构建类unix操作系统的计算机软件合集,由自由软件之父richard stallman开创,于1983年9月27日对外发布。gnu完全由自由软件(free software)构成。gnu语法扩展源自于gcc编译器,在1987年发布1.0版本,称为gnu c compiler。随后,gcc编译器前端支持了c++、objective-c/c++、fortran、ada、java以及最近跃升的go等编程语言,因此现在gcc被称为gnu compiler collection。由于在20世纪90年代,gnu c编译器就对c90标准做了相当多的语法扩展,包括复合字面量、匿名结构体和数组、可指定的初始化器等,这些语法扩展被广泛使用,尤其是大量用于linux内核代码中,因此c99标准将这些语法特性全都列入标准之中。
正因为gcc本身是开源自由软件,因此很多商用编译器也基于gcc进行扩展。像arm的rvct(realview compiler toolkit)本身就支持gnu扩展。还有不少开发平台本身就直接使用gcc编译工具。由于有不少大公司顶级开发人员的参与,因此gcc编译器的目标代码优化能力相当高,而且还支持许多不同的处理器。所以,gcc当前被广泛使用并博得开发者的好评。像linux操作系统基本默认使用gcc作为默认编译器,包括android的ndk开发工具一开始也是如此。
然而,由于gcc基于比较严格的gpl许可证,许多大型商业开发商对它望而却步。该许可证允许使用者免费使用软件,但是要求不能随意对它进行篡改并重新发布。如果开发者对它进行篡改,然后发布自己修改之后的软件,那么必须要把自己修改的那部分也开源出来。因此,在2003年诞生了一个llvm开源项目,基于更为宽松的bsd许可证,其编译器称为clang。bsd许可证允许开发者随意对软件进行修改并重新发布,甚至可以将修改过的版本作为自主版权,因而这个许可证深受大公司的欢迎。现在apple对llvm项目的投入非常大。macos上的开发工具xocde从4.0版本起就开始使用clang编译工具链,随后apple将自己改写的clang编译器称为apple llvm。当前最新的xcode 8所使用的apple llvm版本为8.x。而当前android ndk也支持了clang编译器工具链。clang编译器并非基于gcc,它是从头开始写的。但是它的目标是尽量与gcc编译器兼容,所以clang编译器包含大部分gnu语法扩展,除此之外还含有它自己特有的c语言扩展。当然也有一些特性是gcc含有而clang不具备的,不过这些特性一般很少使用。
我们现在可以看到gnu语法扩展适用性十分广泛。如果读者当前在做linux/unix或windows上的c语言编程开发,或者是在开发macos/ios应用,又或者是在开发android应用,那么完全可以毫无顾忌地使用gnu语法扩展。本书最后几个章节会分别介绍gcc编译器特定的语法扩展以及clang编译器特定的语法扩展。由于clang编译器已经包含了大部分gnu语法扩展,因此在介绍gcc语法扩展的时候,如果当前特性clang不支持,则会指明。