以前の 記事 では、C++ソースコードをモダナイズするために新しいC++11機能をどこで使えるかを特定する clang-modernize ツールについて説明しました。では、プロジェクト内で新しいC++機能が使われている場所を簡単に検出するにはどうすればよいのでしょうか。
FacebookとGoogleは、自社のソースコードでC++11を広範に活用しています。以前の 記事で見たように、FacebookのFollyはほぼすべてのC++11機能を使用しています。Microsoftもオープンソースコードで新しいC++11標準を使っているのか、私は知りたいと思いました。
Microsoftのオープンソースプロジェクトは、同社の GitHub リポジトリで公開されています。その一部はLLVM、Clang、OpenCVなど、Microsoftが自社のニーズに合わせて調整した他プロジェクトのフォークで、残りはMicrosoft自身が開発したものです。ここではその1つを見て、C++11が使われているかを確認してみましょう。最適な候補は、Microsoftの最新オープンソースC/C++プロジェクトの1つである WinObjC。
Windows Bridge for iOS(WinObjCとも呼ばれます)は、Visual Studio/Windows向けのObjective-C開発環境を提供するMicrosoftのオープンソースプロジェクトです。さらに、iOS API互換性のサポートも提供します。
C++11がどこで使われているかを確認する方法の1つは、各ソースファイルを調べることですが、プロジェクトの規模によっては数時間から数日かかる可能性があります。もう1つの方法は、Clangを使うことです。
Clangとその強力な診断エンジンが役に立ちます。
Clangチームは、できるだけ明確で表現力の高いエラーメッセージを提供することを目指しています。コマンドラインコンパイラとして可能な限り使いやすいものにしようと努めています。そのために、Clangはコード内の問題箇所を正確に指摘します。これは、エラー情報を使いやすいメッセージへ変換する診断エンジンによって実現されています。
Clangは多くの種類の診断を出力しますが、今回の目的で特に興味深いのは、次のような説明を持つ診断です。「XXX incompatible with C++98」
では、Visual Studioソリューションに対するClang診断はどう取得すればよいのでしょうか。
1つ目の選択肢は、Clangを使ってプロジェクトをコンパイルすることです。ただし、これは簡単ではありません。Microsoftコンパイラの代わりにClangを使うよう、ビルドプロセスを変更する必要があるからです。
2つ目の選択肢は、 CppDependを使ってVisual Studioプロジェクトを解析することです。CppDependはClangをフロントエンドパーサーとして使用し、その診断をすべて報告します。CppDependは オープンソースコミュニティには無料で提供されています。
WinObjCソリューションに対するClang診断は次のとおりです。

ただし今回必要なのは、「incompatible with C++98」タイプの診断だけです。前のクエリを簡単にフィルタリングして、これらの診断だけを取得できます。

ご覧のとおり、nullptr と auto の言語機能はソースコードの多くの場所で使われています。しかし、FacebookやGoogleのプロジェクトとは異なり、C++11機能は広く使われているわけではありません。また、WinObjCのC++ソースファイルを調べると、C++/CX拡張の方が広範に使われていることが分かります。
まとめ:
C++プロジェクトが新しい標準の機能を使っているかどうか、そしてそれらがどこで使われているかを知ることが有用な場合があります。Clangは、この情報を収集するための強力なツールです。
