以前の 記事 では、C++ソースコードをモダナイズするために新しいC++11/C++14/C++17機能をどこで使えるかを検出する clang-tidy ツールについて説明しました。では、プロジェクト内で新しいC++機能が使われている場所を簡単に検出するにはどうすればよいのでしょうか。
FacebookとGoogleは、自社のソースコードでC++11を広範に活用しています。以前の 記事で見たように、FacebookのFollyはほぼすべてのC++11機能を使用しています。Microsoftもオープンソースコードで新しいC++11標準を使用しているのか、私は興味を持ちました。
Microsoftのオープンソースプロジェクトは、同社の GitHub リポジトリで公開されています。その一部はLLVM、Clang、OpenCVなど、自社のニーズに合わせて調整された他プロジェクトのフォークにすぎませんが、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++コミュニティの素晴らしい活動のおかげで、新しいC++標準は近年ますます広く使われるようになっています。新しい機能の多くは使いやすく、C++コードをモダナイズすることで、可読性と保守性を高められます。
