
C17 是继 C14 之后C 编程语言 ISO/IEC 标准的下一次修订的非正式名称。而就在昨日ISO C 委员会正式发布了 C 17 标准官方名称为 ISO/IEC 14882:2017。C 17 标准化图表C 17 主要特性基于 C 11C 17 旨在使 C 成为一个不那么臃肿复杂的编程语言以简化该语言的日常使用使开发者可以更简单地编写和维护代码。C 17 是对 C 语言的重大更新引入了许多新的语言特性UTF-8 字符文字折叠表达式 (fold expressions)用于可变的模板内联变量 (inline variables)允许在头文件中定义变量在 if 和 switch 语句内可以初始化变量结构化绑定 (Structured Binding)for (auto [key,value] : my_map) {…}类模板参数规约 (Class Template Argument Deduction)用 pair p{1, 2.0}; 替代 pairint, double{1, 2.0};更多的特性还有使 static_assert 的文本信息可选删除 trigraphs在模板参数中允许使用 typename作为替代类来自 braced-init-list 的新规则用于自动推导嵌套命名空间的定义例如使用 namespace X::Y { … } 代替 namespace X { namespace Y { … }}允许命名空间和枚举器的属性新的标准属性[[fallthrough]], [[maybe_unused]] 和 [[nodiscard]]对所有非类型模板参数进行常量评估Fold 表达式用于可变的模板A compile-time static if with the form if constexpr(expression)结构化的绑定声明现在允许 auto [a, b] getTwoReturnValues();在某些情况下确保通过编译器进行 copy elisionGuaranteed copy elision by compilers in some cases一些用于对齐内存分配的扩展构造函数的模板推导允许使用 std::pair(5.0, false) 代替 std::pairdouble,bool(5.0, false)__has_include允许由预处理程序指令检查头文件的可用性__cplusplus 的值更改为 201703L此外C 17 还带来了并行 STL派生自 Boost 的文件系统库等其他特性。作为标准库中新的关键“词汇类型”std::string_view 和 std::optional 将会以函数参数和返回类型的形式广泛使用。这允许开发者编写更简单的签名例如在字符串类型上可以用 std::string_view 替代模板化 (Templatizing)开发者可在函数体内更多地用 std::variant 和 std::any 类型作为类成员并内部使用。LLVM 的 Clang 编译器也已经将代码中出现“C1z”的地方修改为“C17”C 17 曾被称为 C1z。GCC 和 LLVM/Clang 都有效地提供了完整的 C 17 支持。对于正在进行中的 C 20预计在两年内 2019 年夏天完成所有功能