google/gflags のコンフリクトについて

This entry was posted by on Tuesday, 24 July, 2007

ちょっと前に http://googlejapan.blogspot.com/2007/07/google-1.html を読みまして、「へー」と思ったんですが、これってコンフリクトに弱いんじゃないかなあ、という気がしたんですよね。それはどうなんでしょうか。

というけでちょっとテストコードで実行してみましたが、同じ名前で同じ型のフラグを二箇所で宣言すると、リンクするときにエラーになるようですね。ところがフラグの型が違うとリンク時にはエラーにならない。

gflags ではフラグは FLAG_Names_string とか FLAG_Names_bool とかいった型名つきの名前空間に所属するようになっている。したがって違う型では名前空間が違うから、名前衝突のエラーとならない。とはいえ実行時には同じ名前のフラグがあることがわかるので、 ParseCommandLineFlags の実行時にエラーになる。うーん……。

本当に大規模な場合、よく使われるようなフラグ名でこういったコンフリクトが起きたりはしないんでしょうか。

ほかにも、たとえばあるライブラリ L1 が f1 というフラグ名を使っていて、別なライブラリ L2 を開発するときに同じ f1 というフラグを使おうとした。ところが L1 で使われている f1 を L2 で DEFINE すると L2 は L1 とリンクできない。そこで L2 の方を DECLARE で済ませたとする。すると今度は L2 は f1 を DEFINE する外部モジュールがなければ実行ファイルにリンクできないということになるのだが……。

ま、フラグ名のポリシーとかを定めればその辺は回避できそうですが、そうやっているのかな。

ところでParseCommandLineFlags がデフォルトで提供するフラグは help 以外にもいろいろあってなかなか楽しそうです。 -flagfile とか -fromenv なんてのがあるし。 -helpxml とか。

Comments are closed.