00. 软件环境
Visual Studio 2022, Visual C++, Version 17.5.4
01. 问题描述
在应用 https://github.com/ToniLipponen/cpp-sqlite 的过程中,发现源代码文件 sqlite.hpp 中,有一处宏,和本项目的 C++ Language Standard 有关,如下图所示:
将鼠标悬停在 __cplusplus 这个宏上,可以看到它的值展开为:199711L。现在我们更改本项目的 C++ Language Standard,从默认值 Default (ISO C++14 Standard) 更改为 ISO C++17 Standard (/std:c++17),如下图所示:
然而,__cplusplus 宏的值依然是 199711L。无论将 C++ Language Standard 改为任何值,__cplusplus 宏的值都被展开为 199711L,始终没有改变。这是为什么呢,如何纠正这个问题呢?
02. 查阅资料解决问题
通过检索,发现微软官方文档中说明了这个问题:/Zc:__cplusplus (Enable updated __cplusplus macro)
这篇文章里面简单来说,讲的就是这个意思:自从 Visual Studio 2017 Version 15.7 以来,Visual C++ 中增加了一个编译选项:/Zc:__cplusplus,这个编译选项默认是关闭的,只有打开了这个编译选项,__cplusplus 这个宏才能被正确地更新为 C++ Language Standard 对应的值。
进行以下 2 步操作:
- 本项目的 C++ Language Standard,从默认值 Default (ISO C++14 Standard) 更改为 ISO C++17 Standard (/std:c++17)。
- 如下图所示,在项目属性的 C/C++ | Command Line 中,增加:/Zc:__cplusplus
然后,再看看代码编辑器中源代码文件 sqlite.hpp 的 __cplusplus 宏:
将鼠标悬停在 __cplusplus 宏上面,可以看到它已经展开为 201703L 这个值。与我们的预期相符。
微软的官方文档中是这样解释当 /Zc:__cplusplus 编译开关打开或者关闭时 __cplusplus 宏的取值情况的:
03. 参考文献
- /Zc:__cplusplus (Enable updated __cplusplus macro)
- How are the __cplusplus directive defined in various compilers?