前言
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;
}