pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


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