この章の概要です。
C言語や C++ で、Visual Studio 以外のコンパイラにも対応したプログラムを書きたいときがあるかもしれません。しかし、コンパイラごとに対応している機能が異なっていたり、記述のしかたが異なっていたりすることがあるため、あるコンパイラで正常にコンパイルできたソースファイルが、ほかのコンパイラではエラーになってしまうケースがあります。
このようなときには、プリプロセスによる条件コンパイルを活用して対処できます。つまり次のコード例のような感じで、コンパイラの種類ごとに、コンパイルされるコードを切り分けて書くということです。
#ifdef /* Visual Studio */
// Visual Studio の場合にコンパイルされるコード
#else
// Visual Studio でない場合にコンパイルされるコード
#endif
プリプロセスや条件コンパイルについての解説は、C言語編第23章や、新C++編「プリプロセス」にあります。
コンパイラの種類が何であるかは、コンパイラごとにある事前定義マクロによって判断できます。たとえば次のマクロが利用できます。
コンパイラ | 定義されているマクロ |
---|---|
Visual Studio (MSVC) | _MSC_VER |
gcc | __GNUC__ |
clang | __clang__ |
したがって次のように書けます。サポート外のコンパイラに対しても、#error(C言語編第23章や、新C++編「プリプロセス」)で対応しておくと良いでしょう。
#ifdef _MSC_VER
// Visual Studio の場合にコンパイルされるコード
#elif defined(__GNUC__)
// gcc の場合にコンパイルされるコード
#elif defined(__clang__)
// clang の場合にコンパイルされるコード
#else
// 上記のいずれでもない場合のコンパイルされるコード
#error "Unsupported compiler.\n"
#endif
さきほどの _MSC_VER というマクロは、Visual Studio のバージョンごとに異なる整数定数に置換されます。
置換結果はバージョンが上がるごとに大きな数になります。また、Visual Studio のマイナーバージョンアップのときにも数値が加算されることがあります。
Visual Studio バージョン | 置換結果 |
---|---|
2015 | 1900 |
2017 | 1910 ~ 1916 |
2019 | 1920 ~ 1929 |
2022 | 1930 ~ 1940(※Visual Studio 2022 バージョン 17.10 時点) |
_MSC_VER の置換結果は、メジャーバージョンとマイナーバージョンを結合したものですが、さらに細かく、ビルドバージョンやリビジョン番号まで知ることができるマクロも用意されています。詳細は、Microsoft のドキュメントを参照してください。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |