c89、c99、c11区别 您所在的位置:网站首页 c99和c11是什么 c89、c99、c11区别

c89、c99、c11区别

2024-05-22 03:41| 来源: 网络整理| 查看: 265

c89 c99

注: GCC支持C99, 通过 --std=c99 命令行参数开启,如:  代码:gcc --std=c99 test.c --------------------------------------------------------------------------------------------------    1、增加restrict指针  C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。  如果某个函数定义了两个restrict指针变元,编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:代码:  void *memcpy (void *s1, const void *s2, size_t size);  如果s1和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99中memcpy()函数原型如下:代码:    void *memcpy(void *restrict s1, const void *restrict s2,size_t size);  通过使用restrict修饰s1和s2 变元,可确保它们在该原型中指向不同的对象。  2、inline(内联)关键字  内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码.函数的每次调用与返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发生一次函数调用时,变元需要进栈,各种寄存器内存需要保存.当函数返回时,寄存器的内容需要恢复。如果该函数在代码内进行联机扩展,当代码执行时,这些保存和恢复操作旅游活动会再发生,而且函数调用的执行速度也会大大加快。函数的联机扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的函数以及长度较短的函数。   3、新增数据类型   _Bool   值是0或1。C99中增加了用来定义bool、true以及false宏的头文件夹,以便程序员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该使用头文件中的bool宏。  _Complex and _Imaginary C99标准中定义的复数类型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary.头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary,因此在编写新的应用程序时,应该使用头文件中的complex和imaginary宏。  long long int  C99标准中引进了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能够支持的整数长度为64位。  4、对数组的增强  可变长数组  C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组。    数组声明中的类型修饰符  在C99中,如果需要使用数组作为函数变元,可以在数组声明的方括号内使用static关键字,这相当于告诉编译程序,变元所指向的数组将至少包含指定的元素个数。也可以在数组声明的方括号内使用restrict,volatile,const关键字,但只用于函数变元。如果使用restrict,指针是初始访问该对象的惟一途径。如果使用const,指针始终指向同一个数组。使用volatile没有任何意义。  5、单行注释  引入了单行注释标记 "//" , 可以象C++一样使用这种注释了。  6、分散代码与声明  7、预处理程序的修改  a、变元列表  宏可以带变元,在宏定义中用省略号(...)表示。内部预处理标识符__VA_ARGS__决定变元将在何处得到替换。例:#define MySum(...) sum(__VA_ARGS__) 语句MySum(k,m,n);将被转换成:sum(k, m, n); 变元还可以包含变元。例: #define compare(compf, ...) compf(__VA_ARGS__) 其中的compare(strcmp,"small", "large"); 将替换成:strcmp("small","large");  b、_Pragma运算符  C99引入了在程序中定义编译指令的另外一种方法:_Pragma运算符。格式如下:  _Pragma("directive")   其中directive是要满打满算的编译指令。_Pragma运算符允许编译指令参与宏替换。  c、内部编译指令  STDCFP_CONTRACT ON/OFF/DEFAULT 若为ON,浮点表达式被当做基于硬件方式处理的独立单元。默认值是定义的工具。  STDCFEVN_ACCESS ON/OFF/DEFAULT 告诉编译程序可以访问浮点环境。默认值是定义的工具。  STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值为ON,相当于告诉编译程序某程序某些含有复数的公式是可靠的。默认是OFF。  d、新增的内部宏  __STDC_HOSTED__ 若操作系统存在,则为1  __STDC_VERSION__ 199991L或更高。代表C的版本  __STDC_IEC_599__ 若支持IEC 60559浮点运算,则为1  __STDC_IEC_599_COMPLEX__ 若支持IEC 60599复数运算,则为1  __STDC_ISO_10646__ 由编译程序支持,用于说明ISO/IEC 10646标准的年和月格式:yyymmmL  8、for语句内的变量声明    C99中,程序员可以在for语句的初始化部分定义一个或多个变量,这些变量的作用域仅于本for语句所控制的循环体内。比如:代码:for(int i=0; i 0, "FOO has a wrong value"); 5. 删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s()。 6. 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。 7. 匿名结构体/联合体,这个早已经在 gcc 中了,我们并不陌生,定义在 6.7.2.1 p13。 8. 多线程支持,包括:_Thread_local,头文件 ,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等,更多内容清参考 7.26 节。 9. _Atomic类型修饰符和 头文件 ,见 7.17 节。 10. 带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。更多参考 Annex K。 11. 改进的 Unicode 支持,新的头文件 等。 12. 新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition),具体见 7.22.4.7。 13. 创建复数的宏, CMPLX(),见 7.3.9.3。 14. 更多浮点数处理的宏 (More macros for querying the characteristics of floating point types, concerning subnormal floating point numbers and the number of decimal digits the type is able to store)。 15. struct timespec 成为 time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get()。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有