解決 Visual C++ 17.5 __cplusplus 始終為 199711L 的問題
00. 軟件環(huán)境
Visual Studio 2022, Visual C++, Version 17.5.4
01. 問題描述
在應用 https://github.com/ToniLipponen/cpp-sqlite 的過程中,發(fā)現(xiàn)源代碼文件 sqlite.hpp 中,有一處宏,和本項目的 C++ Language Standard 有關,如下圖所示:

將鼠標懸停在 __cplusplus 這個宏上,可以看到它的值展開為:199711L。現(xiàn)在我們更改本項目的 C++ Language Standard,從默認值 Default (ISO C++14 Standard) 更改為 ISO C++17 Standard (/std:c++17),如下圖所示:

然而,__cplusplus 宏的值依然是 199711L。無論將 C++ Language Standard 改為任何值,__cplusplus 宏的值都被展開為 199711L,始終沒有改變。這是為什么呢,如何糾正這個問題呢?
02. 查閱資料解決問題
通過檢索,發(fā)現(xiàn)微軟官方文檔中說明了這個問題:/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 宏上面,可以看到它已經(jīng)展開為 201703L 這個值。與我們的預期相符。
微軟的官方文檔中是這樣解釋當 /Zc:__cplusplus 編譯開關打開或者關閉時 __cplusplus 宏的取值情況的:

在 Visual C++ 中,通過打開 /Zc:__cplusplus 編譯選項來更新 __cplusplus 宏的取值
浙公網(wǎng)安備 33010602011771號