近年ではPHPやRuby、Pythonをはじめとしたスクリプト言語、及びHTMLやCSS、JavaScript、あるいはJavaやC#といったポインターを明示的に扱わない言語で開発するケースが多く、C言語やC++に入るときに要注意の箇所で引っかかるという場合もあるように見受けられる、ここでは各プラットフォームごとにC言語やC++で開発するときに気をつけなければならないことを色々書いてみたい。
Windowsアプリ開発
Windowsアプリ開発においては、大きく分けてデスクトップアプリとWindows Storeアプリの2種類がある。それぞれ大きく分かれているため、別々に書いてみたい。
Windowsデスクトップアプリ
これは初期のWindowsから続くデスクトップ環境で動くアプリのことで、今日では大きく分けてWin32アプリとWin64アプリに分かれている ((.NET Frameworkアプリもあるが、C++を使う場合は基本的にWin32かWin64のどちらかしか対応できない)) 。これらは環境依存の書き方をしない限りはソースコード上の互換性はあるが、バイナリー上の互換性は確保できず、一つのバイナリーで両方のアーキテクチャーに対応したアプリを作ることもできない。また、64bit版Windowsでは32bitアプリも基本的に動作するため、64bit環境で動作することによるメリットが大きいものを除けば、64bit版アプリを作るメリットも薄いため、多くの場合は32bitアプリを開発することで十分といえる。
Windows Storeアプリ
これはWindows 8 ((Windows RTも含める)) 以降及びWindows 10のUniversal Windows Platform(UWP)アプリがこれに該当する。Windows 8以降では基本的にはx86系の32bit版か64bit版のどちらかで、Windows RT及びWindows 10 Mobileの一部でARM(32bit版、64bit版の両方)が使われている状況にある。
Windows Storeアプリにおいても、C++を使った場合は一つのバイナリーで複数のCPUに対応させることはできないため、それぞれのCPU向けのバイナリーを作る必要がある。この場合は、ARMとx86の32bit版の両方には対応させることが求められる。
OS X/iOSアプリ開発
OS X/iOSアプリ開発においては、OS Xにおける歴史的経緯からUniversal Binaryと言われる、複数のアーキテクチャーに対応したバイナリーを含めることができるという経緯から、ソースコードにさえ気をつければ問題ないといえる。
OS Xにおいては、すでにLionの段階でx86_64アーキテクチャーをサポートしたCPUが必須になっているため、基本的にはx86_64向けにビルドすれば問題ない。
iOSにおいては、iPhone 5s以降で64bit化、2015年6月から64bitへの対応が必須となっているため、32bit及び64bitの両方に対応したUniversal Binaryにする必要があるが、これもデフォルトではそうなっているので、ソースコードの書き方に気をつければ問題ない。
Androidアプリ開発
Androidのアプリ開発においては、Android NDKを使う。Androidにおいては、ARM、x86系、MIPSなどがあるため、対応させる予定のあるバイナリーを作る必要がある。AndoirdにおいてはFATバイナリーまたはそれぞのCPUに合わせたバイナリーを切り替えることができるとのことであるため、必要に応じて使い分けるのが望ましいようである。
さいごに
ネイティブのアプリを開発するときは、動作させるターゲットのCPUをどうするのかという問題がつきまとう。C言語及びC++では書き方を間違えると32bit版では問題なく動くのに、64bit版だと動かないというような致命的な問題も少なくない。
ここではそれぞれのプラットフォームで開発するときに気をつけるべき点を幾つか書いたが、もしかしたらそれにとどまらないのかもしれない。とはいえ、これを踏まえていれば問題なく開発できるようにはなるだろう。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。