C99对于普通C的改变

 

一、总述c99:粗略描述,并非完整的归纳。

 

增加部分

1.类型,属于关键字

布尔 _Bool               头文件 <stdbool.h>包含更简明的宏bool,当不与原有代码冲突时,建议包含此头文件。

复数 _Complex         头文件 <complex.h>包含更简明的宏comlex,当不与原有代码冲突时,建议包含此头文件。

虚数 _Imaginary       头文件 <complex.h>包含更简明的宏imaginary,当不与原有代码冲突时,建议包含此头文件。

64位:

long long int = signed long long int

unsigned long long int

 

2.标示符

外部标示符至少31

内部标示符至少63

 

3.restrict类型限定符

“目前只有指针是访问其指向对象的唯一方式。”它有多种用途。详见 C reference book p65

 

4.常量

后缀修饰符

long类型   100L

float        123.3F

unsigned   1000U

c99long long 234LL 123ll

十六进制    0xff

八进制       012

 

5.函数

c99 不支持返回值默认为int,不过大部分编译器仍然允许。

 

6.函数原形

无参数为  int f(void)

 

7.变量的生命周期

c99 中,局部变量几乎可以在任何地方声明。

c89 中,必须在模块开始处

 

void f(int a)

{

int i;

i=10;

int b;

  1. main()函数

原形:

int main()

int main( int argc, char *argv[])  第一个参数为 程序名

  1. inline 内联关键字 c99

只是对编译器的一个提示,见 C reference book p219

 

  1. c99中,对一个变长的数组应用sizeof()时,将在运行时求值。
  2. #pragma伪指令是实现定义的伪指令,可为编译器提供各种指示。

c99包含另一种在程序中指定编译选项的方法:_Pragma 运算符,详见

C reference book p46

 

  1. 预定义宏,详见《C reference book p34
  2. c99 的注释: // ~ /* ~ */
  3. c99的可变参数表

#define my_printf(...) fprintf(stderr,_VA_ARGS_)

详见《C reference book p39

  1. c99中的printf()scanf()支持浮点数格式和long long的输入。
  2. c99大大增加C数学函数库的大小,<math.h>

c99增加判断浮点数非数值类型(INFINITY,NAN)的宏。

能正确处理非数值类型的比较函数。

能通过设置math_errhandling的值设置是返回错误号还是抛出异常。详见《C reference book p302

原有函数库皆是double版本,c99提供floatlong double版本。

  1. c99中,realloc的准确动作和c89中稍有不同。
  2. c99增加的函数

atoll(),把字符串转成long long 型,

llabs(),long long 绝对值

lldiv(), long long

  1. raise()signal()是一组信号响应的函数组。用于异步的事件处理,如可以向注册,当浮点数计算发生异常时,调用某一个函数。详见《C reference book p324

例子

float ab

// 注册信号和相应的函数句柄。

if( signal( SIGFPE, fphandler ) == SIG_ERR )
{

a/b

}

// 异常发生时的处理函数。

void fphandler( int sig, int num )
{
...
}

  1. va_copy宏,在参数列表中复制当前ap的状态,以后可以恢复。就是使参数不仅仅向前遍历。

详见《C reference book p325

  1. c99增加的库功能

复数库 <complex.h>

浮点环境库 <fenv.h>

1.<stdint.h>没有声明任何函数,只定义了大量的整数类型和宏。这些整数类型用来声明已知大小或者具有某种特性的整数

2.<inttypes.h>增加几个专门的整数格式转换函数,允许在整数和最大宽度整数类型之间转换。

3.<tgmath.h>,c99的数学库,具有三种类型的版本。由于c不支持函数重载,使在不同版本间调用函数很难切换。<tgmath.h>中的宏自动根据参数自动转换成相应的函数。

4.<stdbool.h>布尔型

 

  1. at the beginning press  enter key

 

 

 

二、其它知识

goto只能在一个函数中跳转。

register只能用于局部变量。在C语言中,不能获得register变量的地址。

printf,如果与格式限定符匹配的参数不够,输出是不确定的;如果参数数量超过格式限定符数量,则丢弃多余的参数。

三、c不支持的部分

模版

函数重载

默认函数参数值

引用参数, swap(&X, &Y)

你可能感兴趣的:(C99对于普通C的改变)