cpplint

Google C++スタイルガイド 日本語訳 | textdrop

久しぶりに読んだら、cpplintというツールが紹介されていました。C++ソースコードが上記のスタイルに則っているかを調べてくれるようです。面白そうなのでちょっと試してみました。

$ cat before.cpp 
#include <iostream>
using namespace std;

int main()
{
	cout << "Hello, World!" << endl;
}

$ ./cpplint.py before.cpp
before.cpp:0:  No copyright message found.  You should have a line: "Copyright [year] <Copyright Owner>"  [legal/copyright] [5]
before.cpp:1:  Streams are highly discouraged.  [readability/streams] [3]
before.cpp:2:  Do not use namespace using-directives.  Use using-declarations instead.  [build/namespaces] [5]
before.cpp:5:  { should almost always be at the end of the previous line  [whitespace/braces] [4]
before.cpp:6:  Tab found; better to use spaces  [whitespace/tab] [1]
Done processing before.cpp
Total errors found: 5

簡単なプログラムですが、インデントがタブでない(空白を使え)とか、ストリームを使うなといった警告が表示されました。それぞれの詳細はガイドラインを見てもらいたいのですが、以下、ガイドラインに合わせてスタイルを修正してみました。

$ cat after.cpp
#include <cstdio>

int main() {
  std::printf("Hello, World!\n");
}

$ ./cpplint.py after.cpp
after.cpp:0:  No copyright message found.  You should have a line: "Copyright [year] <Copyright Owner>"  [legal/copyright] [5]
Done processing after.cpp
Total errors found: 1

これでもコピーライトが無いといった警告が表示されますが、lintを通すためにわざわざコメントを追加したり、また普段のスタイルを変更することができないといった場合、特定の警告を無視することも可能です。cpplint には filter オプションがあり、これを使用すると任意の警告を無効化することができます。

$ ./cpplint.py --filter=-legal/copyright after.cpp
Done processing after.cpp
Total errors found: 0

using namespaceは存在自体が許されないなど少し厳しい気もしますが、それなりに使えるかもしれません。ブレースの位置やインデントのスペース量など好みに合わない部分は1ファイルのスクリプトなので改造してみると仕事などでも使えるかもしれないですね。