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;
}
相关推荐
垆边人似月.1 小时前
华为题:任务调度
数据结构·c++·算法
局部有解1 小时前
Leetcode - 42 接雨水(一维)
数据结构·c++·算法·leetcode
fpcc2 小时前
c++20新功能—std::osyncstream
c++·c++20
H.莓飛2 小时前
【C++】模板初阶
linux·开发语言·c++·visual studio
十五年专注C++开发2 小时前
基于Asio2实现http服务器的实践总结(二)
服务器·c++·http·asio2
技术不好的崎鸣同学2 小时前
第七章:模块踩踏以覆写导出函数绕过CFG
c++·windows·安全·系统安全
miofly2 小时前
GitHub 今日推荐|ps2-web-recomp:浏览器里跑 PS2 游戏的静态重编译方案
c++·开源·github
沫璃染墨2 小时前
从零入门计算机网络系列(五):UDP套接字编程实战——从核心API到客户端与服务器通信
linux·网络·c++·vscode·网络协议·udp
hetao17338373 小时前
联盟场-提高组-R4 & ZYZSC-S-Round 7
c++·算法