目前 C++ 的標準在 C++11 後更新的還算穩定,都有固定在進化。而主流的 C++ 編譯器,大多也都有跟到一定程度、並且可以透過編譯器的參數來切換要使用的 C++ 標準。
不過,之前忽然很好奇:在 C++ 裡面有沒有辦法知道現在編譯器適用哪個版本的標準在跑?
好奇查了一下資料,這才發現原來在 C++11 裡面,就有加入一個巨集 __cplusplus
、可以用來知道目前編譯器使用的標準了!(C++11FAQ.html#11)
理論上它的結果會是:
而 C++23 的部分,目前似乎是還沒有固定的值?
測試的程式可以寫成:
#include <iostream> int main(int argc, char** argv) { std::cout << "Standard: " << __cplusplus << std::endl; }
不過在 Visual Studio 這邊,預設都會是輸出 C++98 的數值、也就是
。如果要讓他能正確反映對應的標準版本的話,需要另外加上編譯參數「199711L
/Zc:__cplusplus
」才行,有點討厭(參考《MSVC now correctly reports __cplusplus》)。
透過這樣的機制,就可以簡單地判斷現在的編譯器使用的是哪一個版本的 C++ 標準了~比如說想要針對 C++17 以前和以後使用不同的語法的話,就可以寫成下面的形式:
#include <iostream> int main(int argc, char** argv) { #if __cplusplus >= 201703L std::cout << "After C++17" << std::endl; #else std::cout << "before C++17" << std::endl; #endif }
如果想要用新語法寫東西,但是又得顧慮到舊的編譯環境的時候,可能就得用上這樣的方法了?
不過老實說,不同的編譯器就算是都號稱支援 C++ 的某種標準,可能還是會有部分功能不支援,所以上面的寫法,基本上算是比較粗糙的測試方法。
在 C++20 開始,有另外引進功能測試(feature testing)用的巨集、可以用來判斷各項功能是否可以使用(參考)。
另外,Boost.Config 也有提供類似的聚集可以做參考(連結)。
參考:How to determine the version of the C++ standard used by the compiler?