• 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 语法扩展。

关于GNU规范的语法扩展的更多相关文章

  1. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  2. ExtJs对js基本语法扩展支持

    ExtJs对js基本语法扩展支持 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可 ...

  3. GNU风格 汇编语法总结(转)

    转载自:http://blog.sina.com.cn/s/blog_78d30f6b0101713r.html 汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器 ...

  4. ExtJs4 笔记(2) ExtJs对js基本语法扩展支持

    本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可以引入动态加载的概念来即用即取.这 ...

  5. [转载]ExtJs4 笔记(2) ExtJs对js基本语法扩展支持

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/) 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引 ...

  6. ES6规范及语法基础

    var的特点 函数作用域 let的特点 没有变量提升,必须先声明.再调用 同一个作用域下不可以重复定义同一个名称 块级作用域 function fun(){ let a = 10 if(true){ ...

  7. JavaScript变量语法扩展

    1.更新变量 一个变量被重新赋值后,它原有的值会被覆盖,变量值将会以最后一次赋值为准. 2.同时声明多个变量 var   age = 18 , address ='火影村' , gz = 2000 ; ...

  8. C语言编程基础

    主流C语言编译器介绍 关于GNU规范的语法扩展 用C语言构建一个可执行程序的流程 宏定义(无参宏定义和带参宏定义),C语言宏定义详解 条件编译,C语言条件编译详解 原码.反码.补码及位操作符,C语言位 ...

  9. 通过扩展让ASP.NET Web API支持W3C的CORS规范

    让ASP.NET Web API支持JSONP和W3C的CORS规范是解决"跨域资源共享"的两种途径,在<通过扩展让ASP.NET Web API支持JSONP>中我们 ...

随机推荐

  1. Unable to correct problems, you have held broken package

    其实这篇接着上文(一),主要是解决samba安装的问题,中间又是一路曲折.不过这个问题也算是比较典型,有必要记录一下. #apt-get install smb* 安装失败.其实顺利的话,直接一条这样 ...

  2. 十分钟学会Fiddler

    一.Fiddler介绍 Fiddler是一个http抓包改包工具,fiddle英文中有“欺骗.伪造”之意,与wireshark相比它更轻量级,上手简单,因为只能抓http和https数据包,所以在针对 ...

  3. 最长公共子序列(lcs)

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符 ...

  4. spring mvc default-servlet mvc:resources mvc:default-servlet-handler区别

    mvc:default-servlet-handler其实就是default-servlet 交由web容器自己处理 mvc:resources spring来处理 没有被映射的url web容器来处 ...

  5. Python代码的编译

    Python代码的编译 Python代码在解释执行之前,是会被编译成.pyc或者.pyo文件的,它们是中间字节码表示的文件,之后Python虚拟机才会去解释执行它们. 1.pyc文件 ======== ...

  6. spring注解注入属性

  7. Enumeration & Class & Structure

    [Enumeration] 1.当一个枚举值类型已经确定后,可以使用shorter dot syntax来赋予其它值: 2.对一个枚举值switch的时候也可以使用short dot syntax: ...

  8. 使用DevStack安装openstack(单机环境)

    DevStack是一系列可扩展的脚本,用于根据git master的最新版本快速启动完整的OpenStack环境.它以交互方式用作开发环境,并作为OpenStack项目功能测试的基础. 参考源码. 警 ...

  9. Composer安装(windows)

    https://files.cnblogs.com/files/wlphp/Composer-Setup.zip 先下载这个安装包,一直下一步 然后设置composer全局中国景象 composer ...

  10. PHP开发札记-星期/周操作中常用的日期获取方法

    本周一echo date('Y-m-d',(time()-((date('w')==0?7:date('w'))-1)*24*3600)); //w为星期几的数字形式,这里0为周日 本周日 echo ...