关于GNU规范的语法扩展
- 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规范的语法扩展的更多相关文章
- 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...
- ExtJs对js基本语法扩展支持
ExtJs对js基本语法扩展支持 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可 ...
- GNU风格 汇编语法总结(转)
转载自:http://blog.sina.com.cn/s/blog_78d30f6b0101713r.html 汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器 ...
- ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可以引入动态加载的概念来即用即取.这 ...
- [转载]ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/) 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引 ...
- ES6规范及语法基础
var的特点 函数作用域 let的特点 没有变量提升,必须先声明.再调用 同一个作用域下不可以重复定义同一个名称 块级作用域 function fun(){ let a = 10 if(true){ ...
- JavaScript变量语法扩展
1.更新变量 一个变量被重新赋值后,它原有的值会被覆盖,变量值将会以最后一次赋值为准. 2.同时声明多个变量 var age = 18 , address ='火影村' , gz = 2000 ; ...
- C语言编程基础
主流C语言编译器介绍 关于GNU规范的语法扩展 用C语言构建一个可执行程序的流程 宏定义(无参宏定义和带参宏定义),C语言宏定义详解 条件编译,C语言条件编译详解 原码.反码.补码及位操作符,C语言位 ...
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
让ASP.NET Web API支持JSONP和W3C的CORS规范是解决"跨域资源共享"的两种途径,在<通过扩展让ASP.NET Web API支持JSONP>中我们 ...
随机推荐
- Angular 6 HMR 热加载配置
什么是 HMR? HMR 是hot module replacement 的简称,直译:热模块替换,如果不开启HMR模式,angular项目在模块更改的时候会从根节点开始刷新,开启HMR模式以后, ...
- Python内置函数二 (递归函数,匿名函数,二分法)
匿名函数 lambda() 语法: lambad 参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...
- Android使用简单的Service
首先要自定义一个Service,设定它在后台要干什么. public class MyService extends Service { @Nullable @Override public IBin ...
- SMO是英文SQL Server Management Objects的缩写(上一篇文章的补充)
最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文章并不多见, ...
- Oracle11gR2_ADG管理之恢复主库的truncate表实战
备库开启flashback database #关闭备库的同步 SQL> alter database recover managed standby database cancel; Data ...
- c# 通过dllimport 调用c 动态链接库
https://blog.csdn.net/zhunju0089/article/details/80906501 这篇文件很详细 讲述了如何创建c 动态链接库项目 有一些注意的地方 不做介绍 下面是 ...
- 搜索——深度优先搜索(DFS)
设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个 ...
- Linux主机名的设置
Linux主机名的设置 Linux主机名的设置步骤如下: 1.在/etc/sysconfig/network文件中修改HOSTNAME的值为要设置的主机名. HOSTNAME=myhost 2.在/e ...
- 使用百度翻译的API接口
http://api.fanyi.baidu.com/api/trans/product/desktop 这是申请的接口地址,会得到一个APPID和一个钥密 然后下载PHP的对应的代码 有一个PHP文 ...
- web 应用中访问 Spring 具体实现
user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...