欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS2019编译器__cplusplus仍为199711的问题,及CMAKE中的解决方案

程序员文章站 2022-06-25 21:42:08
...

为什么会存在这样的问题?

__cplusplus 预处理器宏通常用于报告 C++ 标准特定版本的支持。 因为很多现有代码需要此宏的值与“199711L”匹配,所以VS系列的编译器不会更改此宏的值。对此微软在vs2017以后的版本中提供了 /Zc:__cplusplus选项用来解决该问题。
参考链接:https://docs.microsoft.com/zh-cn/cpp/build/reference/zc-cplusplus?view=vs-2019

在CMAKE中如何设置?

通过上面的说明,想必大家都知道该如何在VS中将__cplusplus的值更新了,那么我只想用VS的编译器而不希望使用VS该怎么办呢?下面是博主使用CMAKE开启/Zc:__cplusplus选项的一个小例子,希望能给大家一些参考。实际上除了CMAKE,现在还有很多各种各样的构建工具,大家通过参考文档添加编译选项即可。

cmake_minimum_required(VERSION 3.0.0)
project(newfeature01 VERSION 0.1.0)

set(CMAKE_CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED ON)
# 下面代码开启/Zc:__cplusplus选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")

add_executable(newfeature01 main.cpp)

拓展知识

__cplusplus通常会在C与C++混合编写的时候使用,例如:

#ifdef __cplusplus
extern "C" {
#endif
//Do something
#ifdef __cplusplus
}
#endif

但实际上还有一种用法是用来检测当前的编译器是否支持C++11以上的特性,如下例子

#if __cplusplus < 201103L
	#error "Unsupported this compiler. Please use a new version which support c++11."
#endif

此时如果不开启/Zc:__cplusplus选项就使用VS编译器编译含这段小例子的代码就会非常尴尬了.

相关标签: C++ c++ c++11