如果谁说 C11 只是对 C 语言做了大幅度的改进,那么他很可能就错过了 C11 精 彩的地方。事实上,了解 C11 之后,读者只需要看一眼代码,就可以说出代码究竟是 C98/03 的,还是 C11 的。C11 为程序员创造了很多更有效、更便捷的代码编写方式,程序员可 以用简短的代码来完成 C98/03 中同样的功能,简单到你惊呼“天哪,怎么能这么简单”。 从一些简单的数据统计上看,比起 C98/03,C11 大大缩短了代码编写量,依情况最多可 以将代码缩短 30% ~ 80%。 那么 C11 相对于 C98/03 有哪些显著的增强呢?事实上,这包括以下几点:
- ❑通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency)。
- ❑通过统一初始化表达式、auto、declytype、移动语义等来统一对泛型编程的支持。
- ❑通过 constexpr、POD(概念)等更好地支持系统编程。
- ❑通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。
下表列出了 C11 批准通过的语言特性。这是一张相当长的表, 而且一个个陌生的词汇足以让新手不知所措。不过现在还不是了解它们的时候。但看过这张表,读者至少会有这样一种感觉 :C11 的确像是一门新的语言。如果我们将 C98/03 标 准中的特性和 C11 放到一起,C11 则像是个恐怖的“编程语言范型联盟”。利用它不仅 仅可以写出面向对象语言的代码,也可以写出过程式编程语言代码、泛型编程语言代码、函 数式编程语言代码、元编程编程语言代码,或者其他。多范型的支持使得 C11 语言的“硬 能力”几乎在编程语言中“无出其右”。
中文 | English |
---|---|
_cplusplus宏 | _cplusplus macro |
对齐支持 | alignment support |
通用属性 | general attribute |
原子操作 | atomic operation |
auto类型推导(初始化类型推导) | auto(type deduction from 18nitialize) |
C99特性 | C99 |
强类型枚举 | enum class(scoped and strongly typed enums) |
复制及再抛出异常 | copy and rethrow exception |
常量表达式 | constexpr |
decltype | decltype |
函数的默认模板参数 | default template parameters for function |
显式默认及删除的函数(默认的控制) | defaulted and deleted functions(control of defaults) |
委托构造函数 | delegating construtors |
并行动态初始化和析构 | Dynamic Initialization and Destruction with Concurrency |
显式转换操作符 | explicit conversion operators |
扩展的friend语法 | extended friend syntax |
扩展的整型 | extended integer types |
外部模板 | extern templates |
一般的SFINAE规则 | generalized SFINAE rules |
统一的初始化语法和语义 | Uniform initialization syntax and semantics |
非受限联合体 | unrestricted union |
用户定义的自变量 | user-defined literals |
变长模板 | variadic templates |
类成员初始化 | in-class member initializers |
继承构造函数 | inherited constructors |
初始化列表 | initializer lists |
lambda函数 | lambda |
局部类型用作模板参数 | local classes as template arguments |
long long 整型 | long long integers |
内存模型 | memory model |
移动语义(参见右值引用) | move semantics(see rvalue references) |
内联命名空间 | Inline namespace |
防止类型收窄 | Preventing narrowing |
指针空值 | nullptr |
POD | POD(plain old data) |
基于范围的for语句 | range-based for statement |
原生字符串字面量 | raw string literals |
右值引用 | rvalue reference |
静态断言 | static assertions |
追踪返回类型语法 | trailing return type syntax |
模板别名 | template alias |
线程本地存储 | thread-local storage |
Unicode | Unicode |
而从另一个角度看,编程中程序员往往需要将实物、流程、概念等进行抽象描述。但 通常情况下,程序员需要抽象出的不仅仅是对象,还有一些其他的概念,比如类型、类型 的类型、算法,甚至是资源的生命周期,这些实际上都是 C++ 语言可以描述的。在 C11 中,这些抽象概念常常被实现在库中,其使用将比在 C98/03 中更加方便,更加好用。从 这个角度上讲,C++11 则是一种所谓的“轻量级抽象编程语言”(Lightweight Abstraction Programming Language)。其好处就是程序员可以将程序设计的重点更多地放在设计、实现, 以及各种抽象概念的运用上。
总的来说,灵活的静态类型、小的抽象概念、绝佳的时间与空间运行性能,以及与硬件 紧密结合工作的能力都是 C11 突出的亮点。而反观 C98/03,其最强大的能力则可能是 体现在能够构建软件基础架构,或构建资源受限及资源不受限的项目上。因此,C11 也是 C 在编程语言领域上一次“泛化”与进步。
要实现表中的各种特性,需要编译器完成大量的工作。对于大多数编译器供应商来 说,只能分阶段地发布若干个编译版本,逐步支持所有特性(罗马从来就不是一天建成的, 对吧)。大多数编译器已经开始了对 C11 特性的支持。有 3 款编译器甚至从 2008 年前就开 始支持 C11 了:IBM 的 XL C/C++ 编译器从版本 10.1 开始。GNU 的 GCC 编译器从版本 4.3 开始,英特尔编译器从版本 10.1 开始。而微软则从 Visual Studio 2010 开始。最近,苹果的 clang/llvm 编译器也从 2010 年的版本 2.8 开始支持 C++11 新特性,并且急速追赶其他编译器 供应商。
致谢
(加)Michael Wong IBM XL编译器中国开发团队《(C11)深入理解C11:C++ 11新特性解析与应用 迷你》