82、C11标准新特性与相关主题深度解析

C11标准新特性与相关主题深度解析

1. C11新特性概述

C11标准引入了一系列新特性,旨在提升C语言的功能和安全性。这些特性涵盖了程序终止、字符集支持、函数规范、表达式处理、行为分析、内存管理、断言机制以及浮点类型等多个方面。

2. 程序终止相关函数
  • quick_exit函数 :C11除了支持 exit abort 函数外,还新增了 quick_exit 函数(头文件 <stdlib.h> )用于终止程序。调用时需传入一个退出状态作为参数,通常为 EXIT_SUCCESS EXIT_FAILURE ,也可以是特定平台的值。该状态值会返回给调用环境,以指示程序是正常终止还是出现错误。此外, quick_exit 最多可调用32个其他函数来执行清理任务,这些函数需通过 at_quick_exit 函数进行注册,调用顺序与注册顺序相反。每个注册函数必须返回 void 且参数列表为 void
  • atexit函数 :用于注册在程序正常终止时调用的函数。
3. Unicode支持

C11支持16位(UTF - 16)和32位(UTF - 32)的Unicode字符集,这使得应用程序的国际化和本地化更加容易。C11标准的第6.4.5节讨论了如何创建Unicode字符串字面量,第7.28节讨论了新的Unicode实用工具头文件 <uchar.h> 的特性,其中包括用于UTF - 16和UTF - 32字符的新类型 char16_t char32_t 。不过,目前新的Unicode特性在C编译器中尚未得到广泛支持。

4. _Noreturn函数说明符

_Noreturn 函数说明符表示一个函数不会返回其调用者。例如, exit 函数会终止程序,因此不会返回给调用者。C标准库中的此类函数现在使用 _Noreturn 进行声明,如C11标准中 exit 函数的原型为:

_Noreturn void exit(int status);

编译器知道函数不会返回时,可进行各种优化,若不小心让 _Noreturn 函数返回,编译器还会发出错误消息。

5. 类型通用表达式

C11的 _Generic 关键字提供了一种机制,可用于创建宏,根据宏的参数类型调用不同的特定类型版本的函数。在C11中,这用于实现类型通用数学头文件 <tgmath.h> 的特性。许多数学函数提供了接受 float double long double 类型参数的不同版本,此时会有一个宏自动调用相应的特定类型版本。例如, ceil 宏在参数为 float 时调用 ceilf 函数,为 double 时调用 ceil 函数,为 long double 时调用 ceill 函数。C11标准的第6.5.1.1节讨论了使用 _Generic 的详细信息。

6. Annex L:可分析性和未定义行为

C11标准文档定义了编译器供应商必须实现的语言特性。由于硬件和软件平台的多样性,标准在多处指出某些操作的结果是未定义行为,这可能引发安全和可靠性问题。“未定义行为”一词在C11标准文档中约出现50次。
CERT开发的可选Annex L对所有未定义行为进行了审查,发现它们可分为两类:
- 有界未定义行为 :编译器实现者应能采取合理措施避免严重后果。
- 关键未定义行为 :实现者无法采取合理措施。

大多数未定义行为属于第一类。Annex L识别出关键未定义行为,符合Annex L的编译器可对大多数未定义行为采取合理措施,但仍不能保证关键未定义行为的合理表现。程序可通过条件编译指令测试 __STDC_ANALYZABLE__ 宏是否定义,来确定实现是否符合Annex L。

7. 内存对齐控制

计算机平台有不同的边界对齐要求,这可能导致 struct 对象所需内存超过其成员大小总和。C11允许使用 <stdalign.h> 头文件的特性指定任何类型的边界对齐要求:
- _Alignas :用于指定对齐要求。
- alignof 运算符:返回其参数的对齐要求。
- aligned_alloc 函数:用于动态分配对象的内存并指定其对齐要求。

详细信息可参考C11标准文档的第6.2.8节。

8. 静态断言

C的 assert 宏在运行时测试表达式的值,若条件为假,会打印错误消息并调用 abort 函数终止程序,这对调试很有用。C11提供了 _Static_assert 用于编译时断言,在预处理器执行后、编译过程中表达式类型已知时测试常量表达式。详细信息可参考C11标准文档的第6.7.10节。

9. 浮点类型

C11与IEC 60559浮点算术标准兼容,但支持是可选的。该标准定义了浮点算术的执行方式,确保无论计算由硬件、软件还是两者共同完成,以及在不同实现(无论是C语言还是支持该标准的其他语言)中,都能得到相同的结果。

10. 相关资源

以下是一些关于C99和C11标准的网络资源:
|资源类型|链接|说明|
| ---- | ---- | ---- |
|C99标准委员会官方网站|http://www.open-std.org/jtc1/sc22/wg14/|包含缺陷报告、工作论文、项目和里程碑、C99标准的基本原理、联系方式等|
|Visual C++编译器测试负责人博客|http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx|讨论Visual Studio不支持C99的原因|
|C99在Linux和BSD上的库特性文章|http://www.ibm.com/developerworks/linux/library/l-c99/index.html|介绍C99库特性在Linux和BSD上的应用|
|C99新特性总结文章|http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=215|总结C99标准的一些新特性|
|C11标准ANSI版本购买链接|http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2FISO%2FIEC+9899 - 2012|可购买C11标准的ANSI版本|
|C11标准最后免费草案|http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf|C11标准批准和发布前的最后免费草案|
|C11标准维基百科页面|http://en.wikipedia.org/wiki/C11_(C_standard_revision)|描述自C99以来的新特性|
|C11新特性简要列表|http://progopedia.com/dialect/c11/|包含C11的新特性简要列表|
|C11新特性文章|http://www.informit.com/articles/article.aspx?p=1843894|介绍C11的新特性|
|C语言新标准文章|http://www.drdobbs.com/cpp/c-finally-gets-a-new-standard/232800444|讨论并发、关键字、 thread_local 存储类、可选线程等|
|C语言易用性及与C++比较文章|http://www.drdobbs.com/cpp/cs-new-ease-of-use-and-how-the-language/240001401|讨论C11与C++匹配的新特性以及C11中没有对应特性的关键差异|
|ISO标准目录|http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469|ISO标准目录|
|C11新特性简要讨论文章|http://www.i-programmer.info/news/98-languages/3546-new-iso-c-standard-c1x.html|简要讨论C11的一些新特性|
|C11标准探索文章|http://www.drdobbs.com/cpp/the-new-c-standard-explored/232901670|讨论C11 Annex K函数、 fopen() 安全性、修复 tmpnam %n 格式化漏洞、安全改进等|
|C11标准背后的思考文章|http://www.sdtimes.com/link/36892|讨论C编程语言标准委员会为新C11标准制定的指导原则|
|C11安全改进博客|http://blog.smartbear.com/software-quality/bid/173187/C11-A-New-C-Standard-Aiming-at-Safer-Programming|讨论C99标准的问题以及C11标准在安全方面的新希望|
|安全编码书籍|http://www.amazon.com/exec/obidos/ASIN/0321822137/deitelassociatin|讨论Annex K库的安全益处|
|C语言安全改进博客|http://blog.sei.cmu.edu/post.cfm/improving-security-in-the-latest-c-programming-language-standard-1|讨论边界检查接口和可分析性|
|C语言安全编码标准博客|http://blog.sei.cmu.edu/post.cfm/helping-developers-address-security-with-the-cert-c-secure-coding-standard|讨论C语言多年来处理安全问题的方式以及CERT C安全编码规则|
|边界检查示例文章|http://www.securecoding.cert.org/confluence/display/seccode/ERR03-C.+Use+runtime-constraint+handlers+when+calling+the+bounds-checking+interfaces|提供不符合和符合边界检查接口的代码示例|
|C11多线程支持论坛讨论|http://stackoverflow.com/questions/8876043/multi-threading-support-in-c11|讨论C11与C99相比改进的内存排序模型|
|C11和C++11多线程编程幻灯片|http://www.t-dose.org/2012/talks/multithreaded-programming-new-c11-and-c11-standards|介绍C11和C++11语言的新特性,讨论gcc和clang对新标准的实现程度|
|C语言和Ubuntu中使用Posix多线程视频|http://www.youtube.com/watch?v=UqTirRXe8vw|演示C语言和Ubuntu中使用Posix进行多线程编程|
|下一个C标准中的线程幻灯片|http://fileadmin.cs.lth.se/cs/Education/EDAN25/F06.pdf|介绍下一个C标准中的线程相关内容|
|Klaas van Gend讨论C11和C++11多线程编程视频|http://www.youtube.com/watch?v=gRe6Zh2M3zs|Klaas van Gend讨论C11和C++11多线程编程|
|IBM XL C/C++编译器对ISO C11的支持白皮书|http://www.ibm.com/developerworks/rational/library/support-iso-c11/support-iso-c11-pdf.pdf|概述编译器支持的新特性,包括复杂值初始化、静态断言和不返回的函数|

以下是一个简单的流程示例,展示了使用 quick_exit 函数的基本步骤:

graph TD;
    A[开始] --> B[执行一些操作];
    B --> C{是否需要提前终止程序};
    C -- 是 --> D[调用at_quick_exit注册清理函数];
    D --> E[调用quick_exit并传入退出状态];
    E --> F[执行注册的清理函数];
    F --> G[程序终止];
    C -- 否 --> H[继续执行其他操作];
    H --> I[结束程序正常流程];

希望这些信息能帮助你更好地理解C11标准的新特性和相关资源。在实际编程中,合理运用这些特性可以提高程序的性能、安全性和可维护性。

C11标准新特性与相关主题深度解析

11. 符号与运算符总结

在C语言编程中,有众多符号和运算符发挥着重要作用,以下为你详细总结:
| 符号/运算符 | 说明 |
| ---- | ---- |
| \t | 水平制表符转义序列 |
| ^ | 按位异或运算符、倒置扫描集 |
| ^= | 按位异或赋值运算符 |
| __func__ | 预定义标识符 |
| __VA_ARGS__ | 可变参数宏相关 |
| _Pragma | 运算符 |
| , (逗号运算符) | 用于分隔表达式 |
| :: (二元作用域解析运算符、作用域解析运算符、一元作用域解析运算符) | 用于作用域相关操作 |
| ! | 逻辑非运算符 |
| != | 不等式运算符 |
| ? | 条件运算符相关 |
| ?: | 条件运算符 |
| . | 点运算符,用于访问结构体成员 |
| * | 乘法运算符、赋值抑制字符 |
| *= | 乘法赋值运算符 |
| / | 除法运算符 |
| /*…*/ | 多行注释 |
| // | 单行注释 |
| /= | 除法赋值运算符 |
| \\ | 反斜杠字符转义序列 |
| \? | 转义序列 |
| \' | 单引号字符转义序列 |
| \" | 双引号字符转义序列 |
| \0 | 空字符转义序列 |
| \a | 警报转义序列 |
| \b | 转义序列 |
| \f | 换页符转义序列 |
| \n | 换行符转义序列 |
| \r | 回车符转义序列 |
| \t | 水平制表符转义序列 |
| \v | 垂直制表符转义序列 |
| & | 地址运算符、按位与运算符、用于声明引用 |
| && | 逻辑与运算符 |
| &= | 按位与赋值运算符 |
| # | 格式化标志、预处理器运算符 |
| ## | 预处理器运算符 |
| % | 字符在转换说明符中使用、取余运算符 |
| %% | 转换说明符 |
| %= | 取余赋值运算符 |
| %c | 转换说明符,用于字符 |
| %d | 转换说明符,用于十进制整数 |
| %E | 转换说明符 |
| %e | 转换说明符 |
| %f | 转换说明符,用于浮点数 |
| %g | 转换说明符 |
| %hd | 转换说明符 |
| %hu | 转换说明符 |
| %i | 转换说明符 |
| %ld | 转换说明符,用于长整型 |
| %Lf | 转换说明符,用于长双精度浮点数 |
| %lf | 转换说明符,用于双精度浮点数 |
| %lld | 转换说明符,用于长长整型 |
| %llu | 转换说明符,用于无符号长长整型 |
| %lu | 转换说明符,用于无符号长整型 |
| %p | 转换说明符,用于指针 |
| %s | 转换说明符,用于字符串 |
| %u | 转换说明符,用于无符号整型 |
| %X | 转换说明符 |
| + | 标志、一元加运算符、加法运算符 |
| - | 一元减运算符、减法运算符 |
| -- | 自减运算符 |
| ++ | 自增运算符 |
| += | 加法赋值运算符 |
| < | 小于运算符、重定向输入符号 |
| << | 左移运算符、流插入运算符 |
| <<= | 左移赋值运算符 |
| <= | 小于等于运算符 |
| = | 赋值运算符 |
| -= | 减法赋值运算符 |
| == | 相等运算符 |
| > | 大于运算符、重定向输出符号 |
| -> | 结构体指针运算符 |
| >= | 大于等于运算符 |
| >> | 追加输出符号、右移运算符 |
| >>= | 右移赋值运算符 |
| | | 按位或运算符、管道符号 |
| |= | 按位或赋值运算符 |
| || | 逻辑或运算符 |
| ~ | 按位取反运算符 |

这些符号和运算符是C语言编程的基础,熟练掌握它们对于编写高效、准确的代码至关重要。

12. 常见概念与术语解释

C语言中有许多重要的概念和术语,下面为你详细解释:
- 算法 :解决问题的一系列步骤和方法,常见的排序算法有插入排序、归并排序、选择排序等。
- 抽象 :将复杂的事物简化,只关注关键特征,例如抽象基类就是一种抽象的体现。
- 聚合 :一种对象之间的关系,表示一个对象包含另一个对象。
- 敏捷软件开发 :强调快速响应变化、团队协作的软件开发方法。
- 位操作 :对二进制位进行操作,如按位与、按位或、按位异或等。
- 边界检查 :确保数组等数据结构的访问不越界,C11在这方面有相关改进。

以下是一个简单的mermaid流程图,展示了插入排序算法的基本步骤:

graph TD;
    A[开始] --> B[取未排序序列的第一个元素];
    B --> C{是否为第一个元素};
    C -- 是 --> D[放入已排序序列];
    C -- 否 --> E{与已排序序列元素比较};
    E -- 大于 --> F[插入到合适位置];
    E -- 小于 --> G[继续比较下一个已排序元素];
    F --> H{是否还有未排序元素};
    H -- 是 --> B;
    H -- 否 --> I[结束];
13. 错误处理与异常情况

在C语言编程中,会遇到各种错误和异常情况:
- 访问冲突 :访问了非法的内存地址,可能导致程序崩溃。
- 算术溢出和下溢 :进行算术运算时结果超出了数据类型的表示范围。
- 缓冲区溢出 :向缓冲区写入的数据超过了其容量,可能引发安全问题。

为了处理这些问题,C语言提供了一些机制,如 assert 宏用于运行时检查,C11的 _Static_assert 用于编译时检查。以下是一个使用 assert 宏的示例代码:

#include <assert.h>
#include <stdio.h>

int main() {
    int num = 10;
    assert(num > 0);
    printf("The number is valid.\n");
    return 0;
}
14. 数据类型与存储

C语言有丰富的数据类型和存储方式:
- 基本数据类型 :如 int float double char 等。
- 聚合数据类型 :如数组、结构体、联合体等。
- 存储类 :包括自动存储类( auto )、静态存储类( static )等。

以下是一个结构体的定义和使用示例:

#include <stdio.h>

// 定义结构体
struct Person {
    char name[50];
    int age;
};

int main() {
    struct Person p1;
    // 初始化结构体成员
    strcpy(p1.name, "John");
    p1.age = 25;
    printf("Name: %s, Age: %d\n", p1.name, p1.age);
    return 0;
}
15. 结论

C11标准带来了众多新特性和改进,涵盖了程序终止、字符集支持、内存管理、断言机制等多个方面。这些新特性使得C语言在功能和安全性上有了显著提升。通过合理运用这些特性,开发者可以编写出更高效、更安全、更易于维护的代码。同时,了解C语言中的各种符号、运算符、概念和术语,掌握错误处理和数据存储的方法,对于成为一名优秀的C语言开发者至关重要。希望本文能帮助你更好地理解和应用C11标准,在C语言编程的道路上取得更好的成果。

在实际开发中,建议你多参考相关标准文档和网络资源,不断学习和实践,将C11的新特性充分运用到项目中。同时,要注意代码的健壮性和安全性,避免出现常见的错误和异常情况。相信随着你对C11标准的深入理解和掌握,你的编程技能将得到进一步的提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值