Unix运维_如何测试C11和C++11至C17和C++17标准的支持

本文详细介绍了如何在Unix运维环境中测试C11、C++11及C++17标准的支持,包括C语言标准的发展历程和C++11至C++17的关键特性,以及通过代码示例演示了如何利用相关特性进行标准支持检测。
摘要由CSDN通过智能技术生成

Unix运维_如何测试C11和C++11至C17和C++17标准的支持

C语言 标准主要有以下几个版本:

K&R C: 这是 C语言 的第一个标准, 由 Dennis Ritchie 和 Brian Kernighan 于 1978 年在《The C Programming Language》一书中定义。K&R C 标准包含了基本的语法, 数据类型, 运算符等, 但并不是完整的语言规范, 缺少了一些重要的特性, 例如函数原型, 结构体等。

ANSI C: 也称为 C89, 是由美国国家标准协会 (ANSI) 于 1983 年发布的一个标准。该标准定义了 C语言 的全部语法, 数据类型, 库函数等, 是 C语言 的第一个完整的规范。ANSI C 标准引入了一些新特性, 例如函数原型, void 类型, const 限定符等。

C99: 是 ISO/IEC 9899:1999 标准, 于 1999 年发布。C99 标准对 C语言 进行了大量的扩展和改进, 引入了很多新特性, 例如布尔类型, 复数类型, 变长数组, 标准宏等。C99 标准还修正了一些 C89/C90 标准中的错误和不足之处, 使得C语言更加完善和健壮。

C11: 是 ISO/IEC 9899:2011 标准, 于 2011 年发布。C11 标准在 C99 基础上进行了进一步的扩展和改进, 包括了一些新特性, 例如泛型宏, 多线程支持, _Static_assert 等。C11 标准对于一些早期 C标准 中存在的问题进行了修正, 使得 C语言 更加健壮和安全。

C++ 标准自 C++ 的 ANSI/IS0 标准投用以来, 已进行过多次更新:

C++11: 发布时间为 2011年08月12日, 正式名称为 ISO/IEC 14882:2011

C++11 对容器类的方法做了三项主要修改:

(1) 新增了右值引用, 可以给容器提供移动语义。

(2) 新增了模板类 initilizer_list, 因此可将 initilizer_list 作为参数的构造函数和赋值运算符。

(3) 新增了可变参数模板 (variadic template) 和函数参数包 (parameter pack), 可以提供就地创建 (emplacement) 方法。

C++14: 发布时间为 2014年08月18日, 正式名称为 ISO/IEC 14882:2014

C++14 为 C++11 的增量更新。主要是支持普通函数的返回类型推演, 泛型 lambda, 扩展的 lambda 捕获, 对 constexpr 函数限制的修订, constexpr 变量模板化等。

C++17: 发布时间为 2017年12月06日, 正式名称为 ISO/IEC 14882:2017

C++17 更新内容包括:

(01) UTF-8 字符文字, 折叠表达式 (fold expressions): 用于可变的模板, 内联变量 (inline variables): 允许在头文件中定义变量;
(02) 在 if 和 switch 语句内可以初始化变量;
(03) 结构化绑定 (Structured Binding): for (auto [key,value] : my_map) {…};
(04) 类模板参数规约 (Class Template Argument Deduction): 用 pair p{1, 2.0};
(05) 替代 pair{1, 2.0};; >; static_assert 的文本信息可选;
(06) 删除 trigraphs;
(07) 在模板参数中允许使用 typename (作为替代类);
(08) 来自 braced-init-list 的新规则用于自动推导;
(09) 嵌套命名空间的定义;
(10) 允许命名空间和枚举器的属性;
(11) 新的标准属性: [[fallthrough]], [[maybe_unused]] 和 [[nodiscard]];
(12) 对所有非类型模板参数进行常量评估;
(13) Fold 表达式, 用于可变的模板; A compile-time static if with the form if constexpr (expression);
(14) 结构化的绑定声明, 允许 auto [a, b]=getTwoReturnValues ()。

测试 C11 标准的支持

使用 _Generic 关键字来判断是否支持 C11。

代码示例:

#include <stdio.h>
 
int main() {
    printf("%d\n", _Generic(0, int: 1, default: 0));
    return 0;
}

测试 C++11 标准的支持

使用了 C++11 的特性, 比如 nullptr 和列表初始化来判断是否支持 C++11。

示例代码:

#include <iostream>
 
int main() {
    int x = 10;
    int y = 20;
    auto z = x + y; // C++11 auto keyword
    std::cout << "The sum is: " << z << std::endl;
    int* p = nullptr; // C++11 nullptr
    if (p == nullptr) {
        std::cout << "p is nullptr" << std::endl;
    }
    // C++11 uniform initialization
    int a{5};
    std::vector<int> v{1, 2, 3, 4, 5}; // C++11 list initialization
    return 0;
}

测试 C++17 标准的支持

示例代码:

#include <iostream>
#include <string>
#include <variant>
 
int main() {
    std::variant<int, std::string> v = "Hello, C++17!";
    std::visit([](auto&& arg) std::cout << arg << std::endl; }, v);
    return 0;
}

总结

以上就是关于 Unix运维 如何测试C11和C++11至C17和C++17标准的支持 的全部内容。

更多内容可以访问我的代码仓库:

https://gitee.com/goufeng928/public

https://github.com/goufeng928/public

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mostcow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值