2011-01-22 5 views
0

STL、Win32、Boost、posixなどの現在のC/C++ライブラリのサイズが大きいと、問題のある識別子の問題が発生します。名前空間であっても、既存のライブラリと連動するように設計された新しいライブラリを設計する際に、他のライブラリの最もよく使用される識別子と衝突しない識別子を選択することができればうれしいです。標準ライブラリの "取得済み"識別子のリストはどこにありますか?

少なくともC++の標準ライブラリ(0xを含む)では、リストが利用可能である必要があります。誰かがこの目的のためにツールを実行したと思うのは合理的です。ヘッダファイルのセットを読み込んで、名前空間で並べられたすべての名前のリストを作成します。そのようなツールを知っている人は誰ですか?ツールは、特定のcppファイルに#includeされているものだけでなく、ディレクトリツリー内のすべてのヘッダを読み込むのが望ましいでしょう。

+0

doxygenはあなたの後のツールですか? –

答えて

-1

egrepの使用はいかがですか?既存でtogheter動作するように設計された新しいライブラリをdesiging場合でも、名前空間と、他のライブラリの最も使用される識別子と衝突しない識別子を選択することができてうれしいです

+0

1.これを行うための正規表現を書くのは簡単ではないでしょうから。これを行うにはより強力なツールが必要です。 2. '#included 'の可能性があるすべてのファイルの場所はおそらく事前に分かっていないためです。 –

+0

はい、正規表現は設計が容易ではありません(可能ですか?)。いいえ、私は#includeツリーが何をスキャンするかを定義したくないので、ライブラリにあるもの、つまりディレクトリ(ツリー)のすべてのファイルに興味があります。 –

4

[むにゃむにゃは、30個の文字を取得するためにつぶやきます]もの。

私は、かなりのライブラリがそうしていることを認識していますが、この試みは根本的に間違っています。

識別子が重複しないように設計してはいけません。明確で簡潔でわかりやすいように設計してください。これらは唯一の基準でなければなりません。

識別子の衝突は、名前空間のおかげで解決されました。適切に使用されると、名前の衝突は単に発生しません。

+1

"正しく使用されても名前の衝突は起こりません。" - 時にはADLを除いて。例えば、 'std :: swap'のものとは異なるセマンティクスを持つ自由関数' swap'を定義することは、非常に推奨されていません。実際には、それが私が知っている唯一の機能は、ADLを介して過負荷になることが広く予想されていますが、原則としてライブラリが1つを導入するたびに、すべての名前空間が汚染されます。ある呼び出し側が完全修飾なしで 'sort'を呼び出すために' std :: sort'を使っている人がいる場合、それらは潜在的に独自の 'sort'関数を含む名前空間と衝突します。 –

+0

@Steve:trueしかし、それは衝突が発生するとすぐに明示的な資格で解決できるので、それほど大きな問題ではありません。これはローカルの変更に過ぎません( 'using'がヘッダー内でグローバルに使用されていない限り、すべての地獄が緩んでいます)。 –

+0

@Konrad:公正なポイント。名前空間がなければ、Cの同等の衝突は悪夢です。 –

関連する問題