C99标准的新特性
C语言标准的发展
C语言的发展历史大致上分为4个阶段:Old Style C、C89、C99和C11.
C89是最早的C语言规范,于1989年提出,1990年先由ANSI(美国国家标准委员会,American National Standards Institute)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC9899:1990),因而有时也称为C90,最经典的C语言教材[K&R]就是基于这个版本的,C89是目前最广泛采用的C语言标准,大多数编译器都完全支持C89,C99(ISO/IEC9899:1999)是在1999年推出的,加入了许多新的特性,但目前仍没有得到广泛支持,在C99推出之后相当长的一段时间里,连gcc也没有完全实现C99的所有特性。2011年12月8号,ISO 发布了新的 C 语言的新标准——C11,之前被称为C1X,官方名称 ISO/IEC 9899:2011。
本文地址:http://www.cnblogs.com/archimedes/p/c99-new-feature.html,转载请注明源地址。
现在介绍一下C99相对于C89或者ANSI C的新特性:
1.复数(complex)
complex.h是C标准函数库中的头文件,提供了复数算术所需要的宏定义与函数声明。
#define complex _Complex
#define _Complex_I ((const float _Complex)__I__)
#define I _Complex_I
C99规定了关键字_Complex。因而有3种复数类型:
double _Complexfloat _Complexlong double _Complex
次序不是必须遵守的,比如float _Complex也可以写成_Complex float。_Complex_I扩展为类型为const float _Complex的常量值,其值为虚数单位。C99规定complex作为宏扩展为_Complex。但C++未定义complex宏。gcc仅支持complex type,不支持imaginary type。因此宏I扩展为_Complex_I。
<complex.h>里面还包含了不少支持复数的数学函数(c打头的就是):
1、ccos,csin,ctan,cacos,casin,catan:复数域内的三角函数,有对应的f和l版本。
2、ccosh,csinh,ctanh,cacosh,casinh,catanh:复数域内的双曲函数,有对应的f和l版本。
3、cexp,clog,cabs,cpow,csqrt:复数域内的指数、对数、绝对值、幂函数,有对应的f和l版本。
4、carg,cimag,creal,conj,cproj:获取象限角、虚数部分、实数部分、a=x及b=-y、Riemann球上的投影,有对应的f和l版本。
代码:
#include<stdio.h>
#include<complex.h>
int main()
{
double complex cmp = 1.3 + 2.3*I;
printf("%f + %fi\n", creal(cmp), cimag(cmp));
return ;
}
2.指定初始化(Designated Initializers)
在初始化结构体和数组时,可以通过指定具体成员名或数组下标来赋初值
要指定数组的索引对应的值,可以在相应的元素值前使用‘[index] =’,index必须是常量表达式例如:
int a[] = { [] = , [] = };
等价于:
int a[] = { , , , , , };
还可以向下面这样初始化:
int a[] = { [] = , [ ... ] = };
这样可以只初始化a[1], a[8], a[9]三个元素,其他元素的值为0,等价于:
int a[] = {, , , , , , , , , };
对于结构体,指定成员名初始化可以使用‘.fieldname=’,例如:
struct point { int x, y; };
接下来初始化:
struct point p = { .y = yvalue, .x = xvalue }; // 等价于 struct point p = { xvalue, yvalue };
还可以使用冒号:
struct point p = { y: yvalue, x: xvalue };
当然也可以用在union中:
union foo { int i; double d; };
union foo f = { .d = };
3.变长数组(Variable Length Arrays)
C99允许可以定义一个长度为变量的数组(这个数组的长度可以到运行时才决定)
FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
char str[strlen (s1) + strlen (s2) + ];
strcpy (str, s1);
strcat (str, s2);
return fopen (str, mode);
}
GNU示例代码
也可以在结构体或是联合中使用VLA:
void foo (int n)
{
struct S { int x[n]; };
}
你可以使用alloca函数实现类似的功能,但是alloca函数并不是都实现,从另一角度而言,VLA更加的优秀
也可以使用VLA作函数参数:
struct entry
tester (int len, char data[len][len])
{
/* ... */
}
当然也可以后传len
struct entry
tester (int len; char data[len][len], int len) //注意分号
{
/* ... */
}
示例代码:
#include<stdio.h>
void func(int n)
{
int vla[n];
printf("%d\n", sizeof(vla));
}
int main()
{
func();
return ;
}
4.单行注释
gcc支持像C++风格的注释,以‘//’开头直到一行的结束,很多其他支持C99的C编译器都支持,但是c99之前的版本有可能不支持
5.柔性数组成员(Flexible Array Members)
参见《C语言柔性数组》一文
6.long long类型
C99支持64位整型,使用long long int 或使用unsigned long long int,将整型常量声明为long long int,在整数的后面加上‘LL’,若为unsigned long long int,则加上‘ULL’
7.inline函数
c/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生成调用代码(申请是否有效取决于编译器)。一般地说,这样作的优点是省掉了调用函数的开销;缺点则是可能会增加代所生成目标代码的尺寸
实际上,即使没有手工指定inline函数,编译器一般还会选择一些代码量较小但使用频繁的函数作为inline函数,以此作为性能优化的途径之一。
和带参宏定义(Parameterized Macro)相比,具备以下优点:
- 参数类型检查:宏定义中所使用的参数仅仅是在宏定义中被替换,不进行任何的类型检查
- 返回值:宏定义中无法使用return返回
- 便于调试
示例代码:
static inline int
inc (int *a)
{
return (*a)++;
}
8.bool类型
记得以前都是自己写#define TRUE 1, #define FALSE 0 或者 enum boolean之类的宏,现在可以使用<stdbool.h>的bool类型啦
9.复合常量(Compound Literals)
简单来说复合常量就是允许你定义一个匿名的结构体或数组变量。如:
struct foo {int a; char b[];} structure;
structure = ((struct foo) {x + y, 'a', });
等价于:
{
struct foo temp = {x + y, 'a', };
structure = temp;
}
也可以创建一个数组:
char **foo = (char *[]) { "x", "y", "z" };
更多实例:
static struct foo x = (struct foo) {, 'a', 'b'};
static int y[] = (int []) {, , };
static int z[] = (int []) {};
//等价于下面的代码:
static struct foo x = {, 'a', 'b'};
static int y[] = {, , };
static int z[] = {, , };
10.for循环变量初始化(for loop intializers)
C99引入了C++中的for循环变量初始化方式:
for(int i = ; i < ; ++i) {
...;
}
除了写起来方便以外,循环变量的生存周期也被最小化了。这也顺便杜绝了那种把循环变量带到循环外头继续用的恶习
11.C99新增头文件
C89中标准的头文件:
<assert.h> 定义宏assert()
<ctype.h> 字符处理
<errno.h> 错误报告
<float.h> 定义与实现相关的浮点值勤
<limits.h> 定义与实现相关的各种极限值
<locale.h> 支持函数setlocale()
<math.h> 数学函数库使用的各种定义
<setjmp.h> 支持非局部跳转
<signal.h> 定义信号值
<stdarg.h> 支持可变长度的参数列表
<stddef.h> 定义常用常数
<stdio.h> 支持文件输入和输出
<stdlib.h> 其他各种声明
<string.h> 字符串函数
<time.h> 支持系统时间函数
C99新增的头文件
<complex.h> 支持复杂算法
<fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问
<inttypes.h> 定义标准的、可移植的整型类型集合,也支持处理最大宽度整数的函数
<iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
<stdbool.h> 支持布尔数据类型类型,定义宏bool,以便兼容于C++
<stdint.h> 定义标准的、可移植的整型类型集合,该文件包含在<inttypes.h>中
<tgmath.h> 定义一般类型的浮点宏
<wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数
<wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数
注意:还有一些新特性未总结进来,待充分理解实践之后将陆续补充
参考资料
https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions
C99标准的新特性的更多相关文章
- 转:c++ 11 新特性
声 明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的<The Biggest Changes in C++11(and Why You Should Care)&g ...
- C99标准新特性的说明
C99标准新特性的说明 一.说明 ====== 这里的讨论的是C语言的国际标准,即国际标准化组织ISO,制定的C语言标准.历史上ISO制定过4个版本的C语言标准,他们分别是:C90(ISO/IEC ...
- 【转】C++11 标准新特性: 右值引用与转移语义
VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...
- C++11 标准新特性: 右值引用与转移语义
文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...
- 【转】C++11 标准新特性:Defaulted 和 Deleted 函数
原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaul ...
- C99新特性:变长数组(VLA)
C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...
- C99新特性
c99标准允许使用变长数组,变的意思是可以根据变量的值来指定数组的维数,如根据用户的输入值指定数组的大小,印象中以前是不可以的.现在在gcc中是可以的(PS:ansi c标准是C90标准): ==== ...
- 适应c++ 新特性 - 与我 - 多年传统方式开发(新特性参考微软标准:https://msdn.microsoft.com/zh-cn/library/hh279654.aspx)
公司同事都在积极使用c++的新特性,并对其赞不绝口,而自己一直做着传统的c++开发方式,到底这些新特性如何,又是怎么提高开发效率的,我依然在疑问当中,从同事的说法和实际代码操练里,确实在减少代码量,集 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
随机推荐
- debian软件源source.list文件格式说明
在安装完debian操作系统之后大家做的第一件事大概就是修改source.list文件了吧,否则你是无法在线更新软件的,那么source.list文件中的各个配置项的具体含义你搞懂了么?下面就以我的s ...
- Yii中 RBAC(基于角色的访问控制权限)表结构原理分析
这里有几个概念很重要,我简单用大白话说一下; 权限:就是指用户是否可以执行哪些操作. 如:小张可以发帖.回帖.浏览,小红只能回帖.浏览 角色:就是上面说的一组操作的集合. 如:高级会员有发帖.回帖.删 ...
- 企业云部署要如何选择IaaS PaaS和SaaS
1为什么IaaS成了灵丹妙药 我非常惊讶,为什么很多传统企业已经接受了云计算,但接受的方式却往往不尽人意.对大多数企业来说,云计算的投入产出比相对较小,并且局限于基础设施层的环节. 就目前而言,大 ...
- Outlook Web App简介
一.什么是Outlook Web AppOutlook Web Access简称OWA是基于微软Hosted Exchange技术的托管邮局的一项Web访问功能.通过访问Outlook Web Acc ...
- Storm集群部署
一. 说明 Storm是一个分布式实时计算系统,Storm对于实时计算的意义就相当于Hadoop对于批量计算的意义.对于实时性较高的系统Storm是不错的选择.Hadoop提供了map, reduce ...
- [linux笔记]理清linux安装程序用到的(configure, make, make install)
我作为一名经常和linux打交道的程序员,每次在linux安装软件都祈求可以用——apt-get,yum,brew等应用程序管理器安装,有的时候事与愿违,你只能自己编译安装-wtf,说好的美丽世界呢? ...
- 转贴:JavaScript实现Ajax请求简单示例
转至:https://my.oschina.net/u/658145/blog/167651 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...
- PowerDesigner的安装和数据库创建(转载)
此文描述详细,特此转载,仅复制了大部分内容,可参考原文CodeSmith和PowerDesigner的安装和数据库创建(原创) 请大家不要用于商业用途哈,要支持正版,大家都是做软件的,知道开发一套软件 ...
- Sql Server来龙去脉系列之二 框架和配置
本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...
- Web 前端颜色值--字体--使用,整理整理
做网页时经常挑选不好颜色吧...多看看颜色值,或者自己配吧.... 颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义.对光源进行设置的最低值可以是 0(十 ...