こんにちは、高木です。

今回はC++でTcl/Tkのラッパーライブラリを作る上での基本方針についての話題です。

C++のライブラリといえば、ヘッダーファイルとリンクさせるライブラリファイル(*.libとかlib*.aとか)から構成されるのが普通です。
ところが、インライン関数とテンプレートを駆使したheader-onlyライブラリという選択肢もあります。

header-onlyライブラリの魅力は、ヘッダファイルをインクルードするだけで使えてしまう簡便さにあります。
Visual C++なんかは、#pragma comment(lib, ~)によってオートリンクすることができますので、header-onlyライブラリの利点は少ないかもしれませんが、GCCのようにリンクすべきライブラリを個別に指定しないといけない処理系では非常に重要です。
Visual C++の場合も、ライブラリファイルがあるディレクトリを指定しなくてもよくなるわけですからメリットはあります。

逆に、header-onlyライブラリのデメリットもあります。
ひとつは、必要な宣言や定義をすべてヘッダファイルの中で行う必要がありますので、情報隠蔽に制限が生じることです。
もうひとつは、インライン関数やテンプレートを使わなければheader-onlyにできないことで、必要もないのにテンプレートにせざるを得なくなったりすることです。
C++11以降はconstexprが使えるので多少はましになりましたが、本質的な問題は変わっていません。

Tcl/Tkでは、tcl.hやtk.hをインクルードすることで、さまざまは関数や型のシンボルが大域名前空間有効範囲に導入されます。
それだけではなく、多数のマクロも定義されてしまいます。
それらを嫌うなら、header-onlyライブラリは諦めなければなりません。

今回、いろいろ検討を行ったのですが、ラッパーライブラリだけでTcl/Tkのフルスペックの機能を網羅できるはずもなく、結局tcl.hやtk.hをクライアントコード自身でインクルードするケースが多いであろうと判断しました。
それであれば、header-onlyライブラリにして、ヘッダファイルの中でtcl.hやtk.hをインクルードしても結局は同じことなのです。

結論として、今回作るTcl/Tkラッパーライブラリはheader-onlyライブラリとします。
C++/TclやC++/Tkもheader-onlyではなかったので、その意味での差別化もできることでしょう。