という訳で、インライン函数をやめると、函数の仕様はhoge.cppを見れば すべて足りる、という状況にまた1歩近づく訳です。
開発中は、その函数がどう実装されているか、も見たくなることが多いので、 hoge.cppを直接参照します。 でも、ここから函数の中身(実装)を取り除いて適当に整形すれば、 ほかの人にも見せられる仕様文書、まあ函数のリファレンスですな、 それを作ることができます。
という訳で、それを実際に作るスクリプトを紹介。 これは、
&mk_specs("hoge.cpp", "hoge.html");
という具合に呼び出すと、hoge.cpp から必要部分を集めて、 hoge.htmlに出力します。普通はソースファイルがいくつもあるでしょうから、 *.cppすべてについて*.htmlを生成することになります。
# --------------------------------------------------------------------- sub mk_specs { local($cpp, $htmlName) = @_; open(FILE, $cpp) || die "Can't open $cpp\n"; open(OUT, "> $htmlName") || die "Can't open $htmlName\n"; print OUT "<HTML>\n"; print OUT "<HEAD>\n<TITLE>$cpp</TITLE>\n</HEAD>\n"; print OUT "<BODY>\n<H1>$cpp</H1>\n<HR>\n"; print OUT "<PRE>\n"; $write = 1; while (<FILE>) { chop; if (/^#/) { $write = 0; } next if /^\s*$/; next if /^static/; if ($write) { if (/^{/) { # (B) $write = 0; next; } s/&/&/g; s/</</g; s/>/>/g; print OUT "$_\n"; if (/\)\s*:/) { # (C) $write = 0; next; } } else { if ((m:^/\*===:) || (m:^/\*---:)) { # (A) $write = 1; print OUT "\n$_\n"; } } } print OUT "</PRE>\n"; print OUT "<HR>\n<A HREF=\"index.html\">back to index</A>\n"; print OUT "</BODY>\n"; print OUT "</HTML>\n"; close(FILE); close(OUT); }
一応註釈。 C++とのつきあい方(2)で書いたように、 publicやprotectedの函数は/*=====や/*-----のような 水平線がついていて、目立つようになっています。 private函数はこの仕様文書には載せません。 という訳で、この水平線が現れたら抽出を始めます(A)。 函数の機能の説明、引数の意味などはその後ろに書いてあります。
函数の実体が始まるところは行頭が{になっています。 これが現れたら抽出をやめます(B)。
構築子の場合、{の前に初期化並びが現れますが、これは抽出をやめようと いうことで、(C)があります。このパターンは、構築子が
Hoge::Hoge( int munya) : Munya(munya) { ... }
という形になっていることを前提にしています。
ここに示したのは骨組みだけなので、キーワードを強調する (s/\bchar\b/<STRONG>char</STRONG>/g;)とかは 適宜追加して使ってください。 HTMLで出力するのは、実はこういう細工がいろいろできるからなのです。 ついでに目次なんかも生成するようにすればいいですね。