在程式碼中檢查 C++ 編譯器使用的標準

| | 0 Comments| 10:34
Categories:

目前 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?

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *