C++17和20版本差异

前言

C++编译器版本新版默认是兼容旧版本的,但旧版本不大会兼容新版本的代码,一般情况下不会研究旧版本对新特性的支持情况,除非真的有不一般情况(呵呵)

MSVC

Windows下MSVC查看C++版本的方法

Plain 复制代码
cl /?

翻到语言一栏即可看到对C++标准的支持情况

MinGW

查看G++支持的C++标准:C++11、C++14、C++17、C++20

CMake

CMake的C++标准相关宏定义

Plain 复制代码
set(CMAKE_CXX_STANDARD 17)                    # 支持就开启C++17,否则提示失败
set(CMAKE_CXX_STANDARD_REQUIRED ON)           # 管的是标准本身std库
set(CMAKE_CXX_EXTENSIONS OFF)                 # 标准之外的编译器扩展,如微软MSVC或GNU自己加的特性

binary_semaphore

std::binary_semaphore是C++20开始引入的,旧版本的编译器会编译不过,所以include了semaphore这个头文件的都是没有binary_semaphore的,GCC 7.3可以借鉴以下代码实现,重点是try_acquire_for的实现

C++ 复制代码
class CBinarySemaphore
{
public:
    explicit CBinarySemaphore(int initial = 0)
        : m_signaled(initial > 0)
    { }

    void release()
    {
        std::lock_guard<std::mutex> lock(*m_mutex*);
        m_signaled = true;
        m_cv.notify_one();
    }

    template<typename Rep, typename Period>
    bool try_acquire_for(const std::chrono::duration<Rep, Period>& relTime)
    {
        std::unique_lock<std::mutex> lock(*m_mutex*);
        if (!m_cv.wait_for(lock, relTime, [this]() { return m_signaled; }))
        {
            return false;
        }
        m_signaled = false;
        return true;
    }

private:
    std::mutex m_mutex;
    std::condition_variable m_cv;
    bool m_signaled;
};

std::binary_semaphore相关实现:超时不等待返回

filesystem

std::filesystem也是C++20版本才开始有的,可以用于对文件目录的判断

C++ 复制代码
std::filesystem::create_directories(filePath);
if (std::filesystem::exists(filePath) && std::filesystem::is_directory(filePath))
{

}

如果想要在旧版本的编译器编译通过,可以使用Windows原生接口CreateDirectoryA进行判断

Plain 复制代码
if (!CreateDirectoryA(current.c_str(), nullptr) && (GetLastError() != ERROR_ALREADY_EXISTS))
{
    return false;
}
相关推荐
布莱克6051 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
沫璃染墨6 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光8 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记9 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw10 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨11 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光11 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy12 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw13 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别