Windows核心编程第二章笔记

来源:互联网 发布:舆情监控软件下载 编辑:程序博客网 时间:2024/05/17 20:22

Microsoft的C/C++编译器定义了一个内建的数据类型wchar_t,它表示一个16位的Unicode(UTF-16)字符。


声明Unicode字符和字符串的方法如下所示:

// A 16-bit characterwchar_t c = L'A';// An array up to 99 16-bit characters and a 16-bit terminating zerowchar_t szBuffer[100] = L"A String";

字符串之前的大写字母L通知编译器该字符串应当编译为一个Unicode字符串。当编译器将次字符串放入程序的数据段时,会使UTF16来编码每个字符,在这个简单的例子中,在每个ASCII字符之间都用一个0来加以区分。


wcslen这个C运行库能返回Unicode字符串的长度


为了使源代码既能用ANSI编译,又能用Unicode编译,还必须包含TChar.h,该文件定义了以下宏:

#ifdef _UNICODE#define _tcslen wcslen#else#define _tcslen strlen#endif

现在,应该在代码中调用_tcslen,如果已经定义了_UNICODE,它会扩展为wcslen,否则,它会扩展为strlen。


现有的每一个函数(如_tcscpy或_tcscat),都有一个对应的新版本的函数。前面的名称相同,但最后添加了一个_s(代表secure)后缀。所有这些新函数都有一个共同的特征,这有待我们进一步解释。首先,让我们根据以下这段代码来研究一下它们的原型。在以下这段代码中,展示了两个普通字符串函数的定义:

PTSTR _tcscpy (PTSTR strDestination, PCTSTR strSource);errno_t _tcscpy_s (PTSTR strDestination, size_t numberOfCharacters,                PCTSTR strSource);PTSTR _tcscat (PTSTR strDestination, PCTSTR strSource);errno_t _tcscat_s (PTSTR strDestination, size_t numberOfCharacters,                PCTSTR strSource);

在将一个可写的缓冲区作为参数传递时,必须同时提供它的大小。这个值应该是一个字符数。通过对缓冲区使用_countof宏,我们很容易计算出这个值。


所有安全(后缀为_s)函数的首要任务是验证传给它们的参数值。要检查的项目包括指针不为NULL、整数在有效范围内、枚举值是有效的、而且缓冲区足以容纳结果数据。如果这些检查中的任何一项失败,函数都会设置局部于线程的C运行时变量errno。并返回一个errno_t值来指出成功或失败。然而,这些函数并不实际返回。相反,如果是一次调试版构建,它们会显示一个对用户不太友好的Debug Assertion Failed对话框。然后,终止应用程序进行。如果是发行版构建,则直接自动终止应用程序的运行。


在开发应用程序的时候应该使用Unicode字符和字符串。具体理由如下:

  • Unicode有利于应用程序的本地化。
  • 使用Unicode,只需发布一个二进制(.exe或DLL)文件,即可支持所有语言。
  • Unicode提升了应用程序的效率,因为代码执行速度更快,占用内存更少。Windows内部的一切工作都是使用Unicode字符和Unicode字符串来进行的。所以,假如我们坚持传入ANSI字符或字符串,Windows就会被迫分配内存,并将ANSI字符或字符串转换为等价的Unicode形式。
  • 使用Unicode,应用程序能轻松调用所有尚未弃用的Windows函数,因为一些Windows函数提供的版本只能处理Unicode字符和字符串
原创粉丝点击