zhanzr21的个人空间 https://bbs.21ic.com/?1195922 [收藏] [复制] [RSS]

日志

C11标准综述-4

已有 175 次阅读2018-1-5 19:14 |系统分类:兴趣爱好

_Noreturn 函数修饰字

_Noreturn 声明一个函数永远不回返回. 此修饰字有两个目的:1.如果一个函数本来就是设计来不返回,使用了此修饰符可以使得编译器不要报警了; 2.进一步为了优化而提供信息.某些优化选项必须要确定该函数不返回才来进行.比如:

_Noreturn void func (); //C11, func never returns

Unicode支持

Unicode标准定义了三种编码格式:UTF-8, UTF-16, 和UTF-32. 各有其优劣. 目前程序员使用char来表示UTF-8, 用unsigned short或者wchar_t表示UTF-16,使用unsigned long或者wchar_t来表示UTF-32.C11标准使用两种新的平**立的类型:char16_t(UTF-16)和char32_t(UTF-32)对其进行了标准化. (UTF-8还是用char,暂时不改). C11也提供了两个前缀来定义Unicode字符串:u和U. 增加了u8前缀来表示UTF-8编码的文本.另外在<uchar.h>中声明了一些Unicode转换函数.

静态断言

与#if, #error这些预处理伪指令不同,静态断言在一个比较后期的翻译阶段进行计算,此时表达式的类型已经确定. 因此静态的断言能够帮助程序员抓到预编译阶段无法察觉的错误.

边界检查函数

Technical Report 24731-1, 现已成为C11的一部分, 定义了标准C库函数中的字符操作函数的边界检查版本. 边界检查的版本在原来的函数名后资家了_s的后缀.

比如strcat()和strncpy()的边界检查版本分别为:strcat_s()和strncpy_s(). 大多数边界检查的版本会增加一个参数以指示需要使用缓冲区的最大尺寸. 而且大多数这些函数还会进行一些其他运行时检查以侦测种种不同的运行时异常.

来看两个例子:

//C11, safe version of strcat
errno_t strcat_s(char * restrict s1,
                 rsize_t s1max,
                 const char * restrict s2);

strcat_s() 最多拷贝s1max 字节的数据到s1

第二个函数strcpy_s()需要s1max比s2更长(精确地讲,s1_max必须大于strnlen_s(s2, s1max)), 以防止写操作发生在边界之外:

//C11, safe version of strcpy
errno_t strcpy_s(char * restrict s1,
                rsize_t s1max,
                const char * restrict s2);

这些函数最早是由Microsoft的Visual C++ 团队开发的. C11中的实现与Microsoft的类似但有些改动.


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)