版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 C+C+是目前世界上最流行的高级程序设计语言之一,它是C语言的扩展,是一种同时具有面向过程、面向对象和泛型编程特性的混合型程序设计语言。本章主要介绍:在C和C+的标准中所增加的一些新特性和新功能,以及微软公司对C+的扩展MC+和C+/CLI的基本内容。5.1 C与C+C语言是C+的子集,C+是C语言的超集。C+是在C语言的基础上,添加了面向对象和泛型编程的功能后,扩展而成的。1C语言C语言是一种可移植的系统语言,起源于Unix操作系统的开发。C语言是一种灵活高效的高级程序设计语言,但是同时也具有一些面向机器的低级语言特征,所以有人称它是一种中级语言。1)起源虽然早在1957年4月IBM
2、(John W. Bacus)就推出了第一个高级程序设计语言FORTRAN(FORmula TRANslation公式转换),1958年GAMM/ACM(John W. Backus、Peter Naur、C. A. R. Hoare)又推出了ALGOL(ALGOrithmic Language算法语言)。但它们都是为数学和科学计算设计的,不适合于系统编程。Niklaus Wirth1964年John Kemeny 和Thomas Kurtz简化Fortran发明了BASIC(Beginners All-purpose Symbolic Instruction Code BASIC初学者通用指
3、令码)语言,1970年瑞士计算机科学家Niklaus Wirth又在ALGOL68的基础上创造了Pascal语言。前者是为专入门的文科学生设计的,简单易学,至今仍然是业余爱好者的宠物;后者则是结构化程序设计语言的典范、结构优美,曾被广泛用于计算机教学;但是,它们的功能有限、灵活性不够、效率也不高,也都不适合于编写系统编程。附注:1991年和2002年微软公司的Alan Cooper和Paul Vick分别开发出Visual Basic和Visual Basic .NET。1983年Borland公司的Anders Hejlsberg和Philippe Kahn 开发出Turbo Pascal、
4、1985年Niklaus Wirth和苹果公司的Larry Tesler又创造了Object Pascal、1995年Borland公司的Anders Hejlsberg等人在其基础上开发出Delphi。1970年,AT&T贝尔实验室的Ken Thompson和Dennis Ritchie等人在DEC公司的PDP-7小型机上开发出了Unix操作系统,最初的实现是用汇编语言写成的。为了使Unix操作系统具有可移植性,迫切需要一种高级语言工具。为此,(出生在美国纽约的计算机科学家)Dennis Ritchie以B语言为基础,参考了Algol68,于1972年设计出了C语言。1973年他们用
5、C语言重写了Unix,1975年又利用C语言将Unix移植到了PDP-11上。Ken Thompson (左) 与Dennis Ritchie (右)2)特点C语言是一种可移植的系统语言,拥有充分的控制语句和数据结构功能,包含丰富的操作符,从而能够提供强大的表达能力,可以用于许多不同的应用领域。但是,C语言并不是面向科学家和计算机业余爱好者的,而是专门为程序员设计的。为了进行高效的系统编程,C语言提供了强大的功能和极大的灵活性。与其它高级语言相比,C语言的语法简洁、表达自由、库函数丰富。如果将编程比作造房子,则Fortran和Basic等语言就像一些已经预先造好的大预制件,使用起来简单快捷,但
6、是灵活性差、且功能有限,只能造某些固定模式的房屋;而C语言就像一块块的小砖,使用起来虽然繁琐,但是灵活性强、而且功能无限,能够造各式各样的建筑物,不过这就要求C语言程序员具有很高的专业水平。因此,C语言假设使用者都是计算机专家,采取的是程序员负责制。它不进行完备的类型检查,对数组越界也没有限制。为了进行高效的系统编程,C语言还提供了指针和指针运算,程序员可以随意操作全部内存,任意修改任何内容。表达的自由性和操作的任意性,也给C语言带来了很多编程问题和安全隐患。特别是C语言的+/-运算符和指针运算,更是倍受指责。与其它高级语言相比,C语言提供了一些低级语言特征,更面向机器。所以,也有人称C语言是
7、介于高级语言和低级语言之间的一种中级语言。3)K&R C开始的很多年,C语言没有国际标准,只有一个事实标准K&R C。直到1989年和1990年,才分别推出了ANSI C和ISO C(C89或C90);1999年ISO又推出了第2版(C99)。不像Algol、COBOL和Ada等语言,C语言并不是政府部门或国际组织的产物,而属于个人的作品。虽然由于C语言性能优越,使用得越来越广泛,但是在最初的十几年间,C语言唯一的“标准”是1978年Brian Kemighan和Dennis Ritchie编写的C程序设计语言(The C Programming Language)一书,通常称
8、其为K&R C或经典C。该书的附录“C参考手册”(C Reference Manual)成为了C语言的实现指南,但是书中缺少对库函数标准的描述,一般以Unix实现的库函数所为事实标准。说明:因为C语言的语法成分简单,很多基本功能(例如I/O语句)都是靠库函数来实现的。所以,C语言比其它高级语言更依赖于库函数。4)C89/C90标准1983年ANSI(American National Standards Institute 美国国家标准协会)设立了一个X3J11小组,着手进行C语言的标准化。并最终于1989年推出ANSI C (ANSI X3.159-1989),1990年它又成为国际
9、标准ISO C(ISO/IEC 9899:1990 Programming languages C,程序设计语言C),原来叫做ANSI C或ISO C,现在通常称其为C89或C90。标准的指导原则是:l 相信程序员;l 不妨碍程序员做需要完成的事情;l 让语言保持短小简单;l 只提供一种方法来执行一种操作;l 使程序运行速度快,即使不能保证其可移植性。(不追求定义的抽象统一,更优先考虑运行效率)这些其实也正是C语言的设计初衷,所以ANSI/ISO的C标准,对原始的C语言修改并不多。标准C对K&R C的主要改变是,增加了函数原型(prototype),强调对函数的输入参数进行严格的类型检
10、查;并补充定义了C语言的标准函数库。函数原型的类型检查是指:在编译时,对调用函数的实参和函数定义时的形参的类型是否一致,进行严格的检查。目的是减少程序纠错的难度(这类问题在运行时很难查出),同时保证运行的安全和稳定性(避免函数调用栈溢出)。(这也为实现C+函数的参数型多态性提供了条件。)例如:u K&R C:(过时的)power(); / 函数的前向声明power(x, n) / 函数定义int x, n;int p = power(3) * power(3.9, 5.4); / 使用(编译可通过,运行时产生逻辑错误)u C89/C90:(推荐的)int power(int x, in
11、t n); / 函数声明1(函数原型)int power(int, int); / 函数声明2(函数原型)int power(int x, int n) / 函数定义int p = power(3) * power(3.9, 5.4); / 使用(编译不能通过,错误:第1个调用/ 的参数太少、警告:第2个调用的参数自动转换为(3, 5))l C89/C90对K&R C的其它改变有:n 删除了关键字:entry(条目/入口)n 增加了关键字:const(常型变量)、enum(枚举类型)、signed(有符号的,例如signed char)、void(空/无,可用于函数返回值和形参、通用指
12、针类型)、volatile(易变变量,防止编译器错误的优化)n 传递结构:允许将结构本身作为参数传递给函数(原来只允许传地址)n 函数原型:增加了函数原型(便于编译器进行类型检查)n 增加了预处理指令:#elif(else if)、#error(错误,强制编译停止)、#line(修改当前行号和源文件名)、#pragma(附注/编译指令,编译器定义的与实现有关的指令)n 定义了固有宏:_LINE_(当前行号)、_FILE_(源文件名)、_DATE_(当前系统日期)、_TIME_(当前系统时间)、_STDC_(标准C版时为1)5)C99标准对C90的修订工作开始于1994年,在ISO C+(199
13、8)标准推出之后,ISO又于1999年12月16日,推出了C语言标准的第2版:ISO/IEC 9899:1999 Programming languages C(程序设计语言C),一般称其为C99。(1)修订目标C99保持了C语言的本质特性,C继续是一种短小、清晰和高效的语言。C99并没有增加新的本质特性,但是为了满足新的需要,也进行很多小的修订。l C99主要的修订目标有三点:n 支持国际化编程,引入了支持国际字符集Unicode的数据类型和库函数;n 修正原有版本的明显缺点。如整数的移植方法,例如int8_t、int16_t、int32_t和int64_t等类型;n 针对科学和工程的需要,
14、改进计算的实用性。例如添加了复数类型和新数学函数。(2)具体修改l C99对C89/C90的具体修改有:n 增加了C+的/注释风格:原来C语言之支持多行注释:/*/,C99现在也识别单行注释:/ n 增加了关键字:inline(内联函数)、restrict(限制)、_Bool(布尔类型)、_Complex(复数)、_Imaginary(虚数)u 内联函数(inline):链接时不是进行函数调用而是嵌入函数体代码(可减少调用的时间开销,适用于要求运行速度快的小型函数)u restrict:只能用于指针,表明该指针是数据对象的唯一且初始的方式(不是通过指针的赋值运算另外来得的),便于编译器进行代码
15、优化。附注:微软公司VC扩展的restrict,是让编译器限制别名(如用typedef定义的)的使用,必须类型名完全一致(只是类型等价还不够)时,类型检验才能通过u _Bool:布尔类型,为整数类型,一般用1(或非0)表示真、用0表示假。如果包含了C99新增加的标准库头文件stdbool.h,则可以用bool来代替_Bool,并可使用true和false,从而与标准C+兼容u 复数和虚数类型:l 如果包含了C99新增加的标准库头文件complex.h后,就可以用complex来代替_Complex、用imaginary来代替_Imaginaryl 有三种复数和虚数类型:float _Compl
16、ex、double _Complex、long double _Complex;float _Imaginary、double _Imaginary、long double _Imaginaryl 在C99内部,是用二元数组来实现复数的,第一个数组元素为实部、第二个数组元素为虚部l 可以用实数和(定义在complex.h中的)I来初始化一个复变量。例如:#include <complex.h>double complex z = 6.0 8.5 * I, w = 3.0, u = 4.0 * I;C99的关键字(Keywords)(共37个)autoenumrestrictunsi
17、gnedbreakexternreturnvoidcasefloatshortvolatilecharforsignedwhileconstgotosizeof_Boolcontinueifstatic_Complexdefaultinlinestruct_Imaginarydointswitchdoublelongtypedefelseregisterunion其中:黑色的为K&R C原有的关键字,绿色的为C90添加的关键字,红色的为C99新增的关键字。(C90删除了K&R C的关键字entry)n 增加了数据类型:(unsigned) long long int(64位整数
18、)(对应的打印输出格式为%lld或%llu)n 定义了可移植整数类型:因为同一整数类型,在不同字长的计算机系统中,可能位数不一样,这给移植带来了问题。因此,C99在新增加的头文件inttypes.h中定义了已有整数类型的一些别名,便于程序移植。例如:int8_t、int16_t、int32_t、int64_t,uint8_t、uint16_t、uint32_t、uint64_t;intptr_t、uintptr_t。以及表示对应类型常量的方法,例如INT8_C(128)、INT32_C(1234)。n 增加了预定义宏:C99新加了两个预定义宏:_STDC_HOSTED_(是本机环境时为1,否则
19、为0)和_STDC_VERSION_(=199901L时为C99,否则为C89/C90)n 提供了一个预定义标识符:_func_,为一个代表函数名的字符串(该函数中包含有此标识符),该标识符具有函数作用域。(宏具有文件作用域)n 增加了浮点常量的十六进制格式:p或P表示后跟二进制指数(的十进制值)。例如:0xa.1cp10 = (10 + 1/16 + 12/256) * 210 = 10352.0n 增加了浮点数的十六进制打印格式符:%a或%A(代替十进制的%e或%E)、%La或%LA(代替十进制的%Le或%LE)n 可指定初始化的条目:在对数组和结构进行初始化时,原来必须从头到尾顺序指定初
20、值,最多只能省掉对尾部部分赋初值(未被初始化的条目全被置为0)。C99可以用i = v的方法,在花括号中为指定条目i赋初值v。例如:int a6 = 5 = 123; / 最后一个数组元素的初值为123,其余的值全为0int days12 = 31, 28, 4 = 31, 30, 31, 1 = 29; / 则初值序列为31 29 0 0 / 31 30 31 0 0 0 0 0n 支持变长数组(VLA = Variable-Length array):原来的C语言(包括C+)要求数组定义中的大小必须是整数常量表达式,而C99允许使用变量。例如:#define SIZE 12int m, n
21、;int a15, a2SIZE; / C89可以float a3n, a4mn; / C89不允许,C99可以注意:这里的变长,不是说数组的大小可以随意改变;而是指在定义时,数组的大小可以是变量。一旦定义完成,数组的大小就已固定,不允许再进行改变。n 复合文字(compound literal混合直接量):可以用于定义无名数组、给函数传递数组和结构常量参数、给其他数组和结构赋初值等。例如:int *pt = (int ) 53, 16, 88; / 定义无名数组int sum(int a, int n); / 函数原型int total = sum(int ) 4, 3, 5, 2, 4);
22、 / 给函数传递数组常量参数struct book / 定义结构char tutle41;char author31;float price;struct book bk; / 定义结构变量bk = (struct book) “C Programming”, “Dennis Ritchie”, 9.8; / 给结构赋初值n 允许在代码块的任何地方定义变量:原来C语言的块变量定义,必须位于块的开始处(在任何可执行代码之前)。C99允许在代码块的任何地方(包括控制语句部分)定义变量(C+),例如:for(int i = 0; i < 10; i+) n 旧关键字的新位置:C99允许将类型限
23、定词(如const、volatile、restrict)和存储限定词(如auto、register、static)放在函数原型和函数头形参的方括号内。例如:void f(int *const a1, int *restrict a2, double static a320); / 老风格void f(int a1const, int a2restrict, double a3static 20); / 新风格n 弹性数组成员(flexible array member):C99允许在结构的最后定义一个大小可伸缩的弹性数组成员,可以用于结构指针,根据允许情况来动态分配内存。但是操作就像它本来就有
24、这么多数组元素似的,增加了编程的灵活性和源码的可读性。例如:strtuct flex int count;double average;double scores; / 弹性数组成员struct flex *pf;pf = malloc(sizeof(struct flex) + n * sizeof(double);pf->count = n;double sum = 0;for (int i = 0; i < n; i+) fstrm >> pf->scoresi;sum += pf->scoresipf->average = sum / n;n
25、编译指令:在C99中定义了如下三个标准编译指令:#pragma STDC FP_CONTRACT on-off-switch / 允许或禁止浮点表达式压缩#pragma STDC FENV_ACCESS on-off-switch / 通知是否访问浮点环境#pragma STDC CX_LIMITED_RANGE on-off-switch / 通知复数是否范围有限其中的on-off-switch取值为ON、OFF和DEFAULT之一。n C99还新提供了_Pragma预处理运算符,可以将字符串转换成常规的编译指令。例如:_Pragma(“use_bool true false”)等价于#pr
26、agma use_bool true false(3)新增标准库l C99的标准库和头文件n 标准头文件:<assert.h>、<complex.h>、<ctype.h>、<errno.h>、<fenv.h>、<float.h>、<inttypes.h>、<iso646.h>、<limits.h>、<locale.h>、<math.h>、<setjmp.h>、<signal.h>、<stdarg.h>、<stdbool.h
27、>、<stddef.h>、<stdint.h>、<stdio.h>、<stdlib.h>、<string.h>、<tgmath.h>、<time.h>、<wchar.h>、<wctype.h>n 新增加的头文件:在上面的标准头文件中,C99新增加的为:<complex.h>、<fenv.h>、<inttypes.h>、<iso646.h>、<stdbool.h>、<wchar.h>、<wctype.h&g
28、t;。下面将逐个加以简单介绍n complex.h:定义了宏complex、imaginary和I,定义了各种数学函数(与不同数学函数相比,增加的前导字符c表示复数,尾部字符f和l分别表示float和long double类型,没有尾部字符的为double型),例如:double complex ccos(double complex z);float complex ccosf(float complex z);long double complex ccosl(long double complex z);C99中的复数处理函数(省略了f和l版)原型说明double carg(double
29、 complex z);返回z的相位角/辐角(弧度)double cimag(double complex z);返回z的虚部(实数形式)double complex conj(double complex z);返回z的共轭复数double complex cproj(double complex z);返回z在黎曼域上的投影double creal(double complex z);返回z的实部(实数形式)注意:该库VC05不支持n fenv.h:提供对浮点数环境的访问和控制u 开启/关闭对浮点环境的访问:#pragma STDC FENV_ACCESS ON / OFFu 浮点环境类型
30、:fenv_t(整个浮点环境)、fexcept_t(浮点状态标志的集合)u 标准的浮点异常和控制宏:宏表示异常FE_DIVBYZERO抛出被0除异常FE_INEXACT抛出不精确值异常FE_INVALID抛出非法值异常FE_OVERFLOW抛出上溢异常FE_UNDERFLOW抛出下溢异常FE_ALL_EXCEPT抛出位异常或实现所支持的所有浮点异常控制FE_DOWNWARD向下舍入FE_TONEAREST最近舍入FE_TOWARDZERO趋0舍入FE_UPWARD向上舍入FE_DFL_ENV默认环境(const fevn_t*类型)u 库函数原型说明void feclearexcept(int
31、 excepts);清除异常exceptsvoid fegetexceptflag(fexcept_t *flagp, int excepts);将excepts异常的标志存储到flagp中void feraiseexcept(int excepts);抛出excepts异常void fesetexceptflag(const fexcept_t *flagp, int excepts);将异常标志excepts设置为flagp状态int fetestexcept(int excepts);返回excepts指定查询状态的标志位int fegetround(void);返回当前的舍入方向int
32、 fesetround(int round);将舍入方向设为round,成功返回0void fegetenv(fenv_t *envp);将当前环境存入envpint feholdexcept(fenv_t *envp);将当前环境存入envp,清除浮点状态标志,成功返回0void fesetenv(const fenv_t *envp);建立envp表示的环境void feupdateenv(const fenv_t *envp);建立envp表示的环境,并抛出自动存储的浮点异常注意:该库VC05也不支持n inttypes.h:C语言中的同一整数类型,在不同字长的计算机系统中,可能位数不一
33、样,这给移植带来了问题。因此,C99在新增加的头文件inttypes.h中定义了可移植的整数类型。固定长度类型类型名printf说明符scanf说明符最小值最大值int8_tPRId8SCNd8INT8_MININT8_MAXint16_t PRId16SCNd16INT16_MININT16_MAXint32_t PRId32SCNd32INT32_MININT32_MAXint64_tPRId64SCNd64INT64_MININT64_MAXuint8_tPRIu8SCNu80UINT8_MAXuint16_tPRIu16SCNu160UINT16_MAXuint32_tPRIu32SC
34、Nu320UINT32_MAXuint64_tPRIu64SCNu640UINT64_MAX最小长度类型类型名printf说明符scanf说明符最小值最大值int_least8_tPRILEASTd8SCNLEASTd8INT_LEAST8_MININT_LEAST8_MAXint_least16_t PRILEASTd16SCNLEASTd16INT_LEAST16_MININT_LEAST16_MAXint_least32_t PRILEASTd32SCNLEASTd32INT_LEAST32_MININT_LEAST32_MAXint_least64_tPRILEASTd64SCNLEA
35、STd64INT_LEAST64_MININT_LEAST64_MAXuint_least8_tPRILEASTu8SCNLEASTu80UINT_LEAST8_MAXuint_least16_tPRILEASTu16SCNLEASTu160UINT_LEAST16_MAXuint_least32_tPRILEASTu32SCNLEASTu320UINT_LEAST32_MAXuint_least64_tPRILEASTu64SCNLEASTu640UINT_LEAST64_MAX最快的最小长度类型类型名printf说明符scanf说明符最小值最大值int_fast8_tPRIFASTd8SC
36、NFASTd8INT_FAST8_MININT_FAST8_MAXint_fast16_t PRIFASTd16SCNFASTd16INT_FAST16_MININT_FAST16_MAXint_fast32_t PRIFASTd32SCNFASTd32INT_FAST32_MININT_FAST32_MAXint_fast64_tPRIFASTd64SCNFASTd64INT_FAST64_MININT_FAST64_MAXuint_fast8_tPRIFASTu8SCNFASTu80UINT_FAST8_MAXuint_fast16_tPRIFASTu16SCNFASTu160UINT_F
37、AST16_MAXuint_fast32_tPRIFASTu32SCNFASTu320UINT_FAST32_MAXuint_fast64_tPRIFASTu64SCNFASTu640UINT_FAST64_MAX最大长度类型类型名printf说明符scanf说明符最小值最大值intmax_tPRIdMAXSCNdMAXINTMAX_MININTMAX_MAXuintmax_t PRIuMAXSCNuMAX0UINTMAX_MAX可保存指针值的整数类型类型名printf说明符scanf说明符最小值最大值intptr_tPRIdPTRSCNdPTRINTPTR_MININTPTR_MAXuint
38、ptr_t PRIuPTRSCNuPTR0UINTPTR_MAX注意:该库VC05也不支持。但是微软在VC中定义了扩展的C+关键字:_int8、_int16、_int32和_int64;在Windows API定义了INT32、INT64、UINT32和UINT64等数据类型;在.NET框架也定义了Int16、Int32、Int64、UInt16、UInt32和UInt64等结构类型。n iso646.h:定义了运算符的替代字符串宏andand_eqbitandbitorcomplnotnot_eqoror_eqxorxor_eq运算符&&&=&|!=|=注意:
39、该C库VC05支持n stdbool.h:定义了bool(_Bool)、false(0)和true(1)等宏。注意:该C库VC05也不支持。但是C+标准支持,它们都是C+的关键字。n wchar.h:定义了扩展的多字节字符和宽字符工具:(参见wchar.doc,该C库VC05支持)u 数据类型:l wchar_t:可表示本地环境所支持的最大扩展字符集的一种整数类型,在VC05中定义为unsigned short(2B)l wint_t:可表示最大扩展字符集任何值以及其他值的一种整数类型,在VC05中定义为int(4B)l size_t:由sizeof返回的整数值类型,在VC05中定义为unsi
40、gned int(4B)(在Win64中定义为unsigned _int64)l mbstate_t:为一种非数组的对象类型,用于保存多字节字符与宽字符之间转换所需状态信息。在VC05中定义为int(4B)l struct tm:用来保存日历时间成分的结构类型,至少应该包含下列成员:int tm_sec; / seconds after the minute 0, 60int tm_min; / minutes after the hour 0, 59int tm_hour; / hours since midnight 0, 23int tm_mday; / day of the month
41、 1, 31int tm_mon; / months since January 0, 11int tm_year; / years since 1900int tm_wday; / days since Sunday 0, 6int tm_yday; / days since January 1 0, 365int tm_isdst; / Daylight Saving Time flag在VC05中定义也为:struct tm int tm_sec; /* seconds after the minute - 0,59 */ int tm_min; /* minutes after the
42、 hour - 0,59 */ int tm_hour; /* hours since midnight - 0,23 */ int tm_mday; /* day of the month - 1,31 */ int tm_mon; /* months since January - 0,11 */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday - 0,6 */ int tm_yday; /* days since January 1 - 0,365 */ int tm_isdst; /* dayl
43、ight savings time flag */ ;u 符号常量宏:l NULL(空指针,VC05中定义为(void *)0))l WCHAR_MAX(wchar_t的最大值,VC中定义为0xFFFF65535)l WCHAR_MIN(wchar_t的最小值,VC05中定义为0)l WEOF(宽字符文件的结尾,是EOF的宽字符表示,在VC05中定义为(wint_t)(0xFFFF)65535)u 宽字符I/O函数:l I/O函数:(字符和串格式符从%c和%s改为%lc和%ls)int fwprintf(FILE * stream, const wchar_t * format, .);int
44、 fwscanf(FILE * stream, const wchar_t * format, .);int swprintf(wchar_t * s, size_t n, const wchar_t * format, .);int swscanf(const wchar_t * s, const wchar_t * format, .);int vfwprintf(FILE * stream, const wchar_t * format, va_list arg);int vfwscanf(FILE * stream, const wchar_t * format, va_list ar
45、g);int vswprintf(wchar_t * s, size_t n, const wchar_t * format, va_list arg);int vswscanf(const wchar_t * s, const wchar_t * format, va_list arg);int vwprintf(const wchar_t * format, va_list arg);int vwscanf(FILE * stream, const wchar_t * format, va_list arg);int wprintf(const wchar_t * format, .);i
46、nt wscanf(const wchar_t * format, .);wint_t fgetwc(FILE *stream);wchar_t *fgetws(wchar_t * s, int n, FILE * stream);wint_t fputwc(wchar_t c, FILE *stream);int fputws(const wchar_t * s, FILE * stream);int fwide(FILE *stream, int mode);wint_t getwc(FILE *stream);wint_t getwchar(void);wint_t putwc(wcha
47、r_t c, FILE *stream);wint_t putwchar(wchar_t c);wint_t ungetwc(wint_t c, FILE *stream);l 字符串工具:double wcstod(const wchar_t * nptr, wchar_t * endptr);float wcstof(const wchar_t * nptr, wchar_t * endptr);long double wcstold(const wchar_t * nptr, wchar_t * endptr);long int wcstol(const wchar_t * nptr,
48、wchar_t * endptr, int base);long long int wcstoll(const wchar_t * nptr, wchar_t * endptr, int base);unsigned long int wcstoul(const wchar_t * nptr, wchar_t * endptr, int base);unsigned long long int wcstoull(const wchar_t * nptr, wchar_t * endptr, int base);wchar_t *wcscpy(wchar_t * s1, const wchar_
49、t * s2);wchar_t *wcsncpy(wchar_t * s1, const wchar_t * s2, size_t n);wchar_t *wcscat(wchar_t * s1, const wchar_t * s2);wchar_t *wcsncat(wchar_t * s1, const wchar_t * s2, size_t n);int wcscmp(const wchar_t *s1, const wchar_t *s2);int wcscoll(const wchar_t *s1, const wchar_t *s2);int wcsncmp(const wch
50、ar_t *s1, const wchar_t *s2, size_t n);size_t wcsxfrm(wchar_t * s1, const wchar_t * s2, size_t n);wchar_t *wcschr(const wchar_t *s, wchar_t c);size_t wcscspn(const wchar_t *s1, const wchar_t *s2);size_t wcslen(const wchar_t *s);wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2);wchar_t *wcsrchr(
51、const wchar_t *s, wchar_t c);size_t wcsspn(const wchar_t *s1, const wchar_t *s2);wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2);wchar_t *wcstok(wchar_t * s1, const wchar_t * s2, wchar_t * ptr);wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n);int wmemcmp(wchar_t * s1, const wchar_t * s2
52、, size_t n);wchar_t *wmemcpy(wchar_t * s1, const wchar_t * s2, size_t n);wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2, size_t n);wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n);size_t wcsftime(wchar_t *s, size_t maxsize, const wchar_t *format, const struct tm *timeptr);size_t wcsfxtime(wchar_t
53、 *s, size_t maxsize, const wchar_t *format, const struct tmx *timeptr);l 转换函数:wint_t btowc(int c);int wctob(wint_t c);int mbsinit(const mbstate_t *ps);size_t mbrlen(const char * s, size_t n, mbstate_t * ps);size_t mbrtowc(wchar_t * pwc, const char * s, size_t n, mbstate_t * ps);size_t wcrtomb(char *
54、 s, wchar_t wc, mbstate_t * ps);size_t mbsrtowcs(wchar_t * dst, const char * src, size_t len, mbstate_t * ps);size_t wcsrtombs(char * dst, const wchar_t * src, size_t len, mbstate_t * ps);n wctype.h:提供与ctype.h类似的宽字符函数。(也参见wchar.doc,该C库VC05也支持)u 类型:l wint_t:可保存扩展字符值的一种整数类型,VC05中定义为unsigned short(2B)l
55、 wctrans_t:表示特定字符映射的一种标量类型,VC05中定义为wchar_t(2B)l wctype_t:表示字符分类的一种标量类型,VC05中也定义为unsigned short(2B)u 符号常量宏:l WEOF:宽字符输入的文件结尾,VC05中定义为(wint_t)(0xFFFF) 65535u 函数:l 分类函数:int iswalnum(wint_t wc);int iswalpha(wint_t wc);int iswcntrl(wint_t wc);int iswdigit(wint_t wc);int iswgraph(wint_t wc);int iswlower(wint_t wc);int iswprint(wint_t wc);int iswpunct(wint_t wc);int iswspace(wint_t wc);int iswupper(wint_t wc);int iswxdigit(wint_t wc);l 可扩展分类函数:int iswctyp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 糖尿病合并肾病综合征护理
- 电气成套厂检验员培训
- 【天津卷】天津市北辰区2024-2025学年高三上学期11月期中考试(11.4-11.6)政治试卷含答案及解析
- 班长管理培训结业汇报
- 西餐厅实践报告范文
- 有关保护动物倡议书(31篇)
- 艾滋病日主题扳回
- 儿童娱乐设施安全检查制度
- 胺碘酮治疗房颤
- 装载机安全作业培训
- 国企治理实战100问
- 四年级数学上册 第6章《除法》单元测评必刷卷(北师大版)
- 小学五年级上学期科学《心脏和血液》教案
- 媒体创意经济:玩转互联网时代学习通超星期末考试答案章节答案2024年
- 译林版(2024新版)七年级上册英语期中复习:完形填空10空18篇练习题(含答案解析)
- 剑指CET-4:大学生英语能力基础学习通超星期末考试答案章节答案2024年
- 《七律二首 送瘟神》教案- 2023-2024学年高教版(2023)中职语文职业模块
- 第五单元测试卷(单元测试)-2024-2025学年统编版六年级上册语文
- 员工入职登记表
- 浙江省杭州市(2024年-2025年小学四年级语文)人教版期中考试((上下)学期)试卷及答案
- 智能家居员工劳动合同范本
评论
0/150
提交评论