私が業務で開発するアプリはmacOS用のアプリが多くあります。そのため、使用するプログラミング言語はネイティブ開発対応の以下のコードが多くなります。
- Objective-C / Objective-C++
- Swift
- C++
- C言語
プログラミング言語の選択
どの言語を使用して実装するかは、何を実装したいのかに大きく依存します。
MacOSのAPIを使用する機能では、SwiftやObjective-Cが第一候補となります。新規に開発するプログラムではSwift一択となることでしょう。一方で、長年にわたって開発・運用しているプログラムではObjective-Cで実装します。
WindowsやLinuxなど、Appleプラットフォーム以外のプラットフォームにも対応しているプログラムでは、C言語やC++を使用します。
C++の進化
C++の進化について、今回の記事では注目しています。C++は非常に歴史のある言語です。デジタル大辞泉によると、1992年に米国AT&T社が策定したのが始まりです。C++は国際標準規格によって、言語の機能や標準ライブラリのインターフェイスが策定されています。最新の標準規格はC++20です。
- C++20 (2020年)
- C++17 (2017年)
- C++14 (2014年)
- C++11 (2011年)
- C++03 (2003年)
- C++98
C++国際標準規格 – cpprefjp C++日本語リファレンスより
Xcodeの対応状況
Xcodeに内蔵されるClang/LLVMもC++標準に対応しています。Xcodeのどのバージョンがどの標準規格に対応しているかについて、以前、調べようと思ったのですが、あまりに大変で断念したことがあります。しかし、今はAppleが公式ドキュメントを公開しています。
C++ Language Support – Xcode – Apple Developer

この記事を執筆している時点ではC++23は策定中なのですが、既にXcode 15で対応が始まっていることが分かります。
動作環境によって使用可能な標準規格は変わる
macOSアプリでは、多くの場合、古いOSにも対応してほしいという要望を受けることが多いです。この記事の執筆時点(2023年8月13日)ではmacOS 14 (OS X Mavericks) 以降が最低環境になることが多いです。C++で実装するときには標準ライブラリを必ず利用します。すると、動作環境に合わせて使用可能な標準規格が変わります。macOS 14.0であれば、Xcode 10.1以降が使用可能なので、上記のページを確認すると。。。残念ながら載っていません。
なお、Xcodeの動作環境はテックブログにまとめ記事を作っています。Xcodeがリリースされる度に更新しています。

仕方がないので、Xcodeを起動して選択可能なC++標準を確認します。
Xcodeでは使用するC++標準をビルド設定で設定します。ビルド設定の「Apple Clang – Language – C++」の「C++ Language Dialect」を開きます。すると、次の選択肢が表示されます。
- C++98
- GNU++98
- C++11
- GNU++11
- C++14
- GNU++14
- C++17
- GNU++17
- Compiler Default

C++17まで対応しているようです。細かく見ると使えない機能があるかもしれないですが。。。
というのも、C++標準への対応というのはコンパイラによって異なります。各コンパイラが対応するプラットフォームの事情(都合)により実装方法が異なり、結果、制約があったり、一部使えないことがあったりなどします。ビルドエラーで気がつきます。
C++17まで使えるとなると、クロスプラットフォーム対応部分はC++標準の範囲で実装できる可能性が高くなってきます。
スレッド関連や日時に関する処理があると、ネイティブAPIを使うことが多かったのですが、C++11以降はC++標準ライブラリだけでも実装できます。
これからは動作環境の都合でC++標準にあるのに使えない、ということ少なくなっていくだろうと思います。
また、SwiftやObjective-Cだけではなく、C/C++も併用して色々なプラットフォームに素早く対応できるようにするというのが、やりやすくなっていくだろうと思います。
先日も通信速度を表示する機能を実装するときに、通信に要した時間を計測するコードを実装する必要があり、C++で実装しました。対象のアプリはObjective-C++で書かれている処理なので、Objective-CのNSDate
を使って実装することも可能です。しかし、Objective-C++ではありますが、C++のクラス内だったので、C++11のchronoライブラリを使って実装しました。
chronoライブラリを使った処理時間の計測処理は、Objective-Cのコードよりも汎用的です。また、可読性も高いコードになります。コード例については次の記事をご覧ください。
