C++ BuilderでWindows向けアプリのマイグレーションでClangの有無と32bit/64bitの違いをifdefで場合分けする
C++ Builder ではWindows向けアプリの開発では3種類のコンパイラを選ぶことができます。ただし Starter は BCC32 だけのようですが。
BCC32 | レガシーな32bitコンパイラ。 |
BCC32C | Clangベースの32bitコンパイラ。(2015年の 10 Seattle から提供開始) |
BCC64 | Clangベースの64bitコンパイラ。(2012年の XE3 から提供開始) |
さて、2012年より前に実装したコードは基本的にBCC32向けに書かれているわけですが、これをBCC32CやBCC64にマイグレーションする場合にはコンパイラの違いに依存する処理を念のために if defined で場合分けしておくと安心です。(新しいコンパイラは枯れていない部分があるために想定外の挙動をする可能性が懸念されるので)
この場合分けは以下のように記述できるようです。
#if defined(__BORLANDC__) && defined(__clang__) && defined(_WIN64) // BCC64向けの処理 #elif defined(__BORLANDC__) && defined(__clang__) && defined(_WIN32) && !defined(_WIN64) // BCC32C向けの処理 #elif defined(__BORLANDC__) && !defined(__clang__) && defined(_WIN32) && !defined(_WIN64) // BCC32向けの処理 #endif
Windoiwsアプリしか実装しないならば、BCC32向けの処理は #eif ではなく #else でもよいのですが、将来的にマルチプラットフォーム(Mac/iOS/Android) 向けの実装を行うことを想定した場合は #elif で明示的に場合分けしたほうがよさげです。
ネタ的にはここら辺から拾ってきました。
BCC64 - RAD Studio
BCC32C - RAD Studio
BCC32 - RAD Studio
また、その他の定義済みマクロについては以下が参考になります。(ただし docwiki の他のページでは、ここに書かれていないマクロも普通に出てきたりするのですが... orz)
定義済みマクロ - RAD Studio