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标准的深入理解和掌握,你的编程技能将得到进一步的提升。
超级会员免费看
6106

被折叠的 条评论
为什么被折叠?



