C言語初心者だし、大きなコードベースも扱ってないけど、自分の現状のまとめ。知識不足は間違いないので、他に便利なものがあればコメントにて教えて下さい。
プロジェクトテンプレート
Makefileの書式は多分一生覚えられないと思う。
だので、segmentio/khaosを使ってMakefileその他を生成できるようにしている。ディレクトリ構成で悩みたくないので、1実行ファイルにつき1プロジェクトを作成する方式。
これは自作のテンプレートだけど、Cプロジェクトなんて千差万別なので好きなのを作る方がいいと思う。
MakeじゃなくてSconsでやってみたこともある。必要なことが網羅されておりすこぶる快適という感触はあったものの、どこでもすぐに導入出来るかというとむずく、Pythonバージョン依存関連でyak shavingを招いてしまった。きちんと整備された環境ならSconsで問題ないと思う。
C言語、便利なものも多々あれど、ビルドにあれとかこれが必要で、導入時点でfailするってケースがかなりあって辛い。npmって楽なんだなあって本当に思った。
gulpじゃなくてMakefileいいぞって言ってる人見かけるけど、Makefileの記法辛くないのかなぁ。
makeheaders
ヘッダの手書きは辛いのでmakeheadersを使う。序盤のうちは一切ヘッダ手書きしなくていいかも。
makeheaders *.c
だけ書いたシェルスクリプトを置いておくと楽。
構造体をヘッダに含めたいときはどうするんだろう。生成されたヘッダはいじらず、後で結合とかすればいいのかな?
あとできればNode.jsで実装しなおしたようなポータブルなものがほしい。
astyle
コードフォーマッタにはastyleを使っている。下記のような設定にしている。
astyle --indent=tab -p -n -k3 -W3 --style=1tbs src/*.c src/*.h
1tbsというのは、K&Rのバリエーションらしい。見た目で決めたけれど、プロジェクト全体でフォーマットが揃ってれば2スペでも何でもいいと思っている。
単体テスト
CuTestとかCppUTestとかいろいろあり、いくつかは使ってみたけど、案外ノーフレームワークで書くのが手っ取り早い。
void testSomething(){
int ret = something(1);
if (ret) {
printf("#1 %s OK!\n", __func__);
} else {
printf("#1 %s Fail\n", __func__);
}
//文字列比較
unsigned char *str = somethingStr(1);
if (strcmp(str, "1") == 0) {
printf("#2 %s OK!\n", __func__);
} else {
printf("#2 %s Fail\n", __func__);
}
}
int main(void)
{
testSomething();
return 0;
}
CIとかやるにはこれじゃ全然ダメだけど、最低限はこんな感じ。あとからフレームワークを使う形にも書き直しやすい気がする。valgrindに食わせる時も特に迷うことがない。
今後
実のところCのプロジェクトのルートにpackage.jsonを置きたい気持ちが生まれている。astyleとかmakeheadersとか、Node実装があってnpm installでさくっと入ったらいいのにな、とか、バイト操作めんどいUtil欲しいとか、ゆとり的な感想を持ってしまう。
もっと楽しく書けるようになったらいいなと思うけれど、なんだか面倒事や落とし穴が多くて、楽しくなるまでにはまだまだ時間がかかりそうだし、その頃には定年になっていそう。