资讯动态

C++17和20版本差异

发布时间:2026/10/15 17:15:52 来源:尧图企业网站定制
前言C编译器版本新版默认是兼容旧版本的但旧版本不大会兼容新版本的代码一般情况下不会研究旧版本对新特性的支持情况除非真的有不一般情况呵呵MSVCWindows下MSVC查看C版本的方法cl /?翻到语言一栏即可看到对C标准的支持情况MinGW查看G支持的C标准C11、C14、C17、C20CMakeCMake的C标准相关宏定义set(CMAKE_CXX_STANDARD 17) # 支持就开启C17否则提示失败 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 管的是标准本身std库 set(CMAKE_CXX_EXTENSIONS OFF) # 标准之外的编译器扩展如微软MSVC或GNU自己加的特性binary_semaphorestd::binary_semaphore是C20开始引入的旧版本的编译器会编译不过所以include了semaphore这个头文件的都是没有binary_semaphore的GCC 7.3可以借鉴以下代码实现重点是try_acquire_for的实现class CBinarySemaphore { public: explicit CBinarySemaphore(int initial 0) : m_signaled(initial 0) { } void release() { std::lock_guardstd::mutex lock(*m_mutex*); m_signaled true; m_cv.notify_one(); } templatetypename Rep, typename Period bool try_acquire_for(const std::chrono::durationRep, Period relTime) { std::unique_lockstd::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相关实现超时不等待返回filesystemstd::filesystem也是C20版本才开始有的可以用于对文件目录的判断std::filesystem::create_directories(filePath); if (std::filesystem::exists(filePath) std::filesystem::is_directory(filePath)) { }如果想要在旧版本的编译器编译通过可以使用Windows原生接口CreateDirectoryA进行判断if (!CreateDirectoryA(current.c_str(), nullptr) (GetLastError() ! ERROR_ALREADY_EXISTS)) { return false; }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑