問題タブ [unnamed-namespace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 名前のない名前空間の変数のファイル情報を PDB ファイルから取得するにはどうすればよいですか?
名前のない名前空間の変数に対応する PDB ファイルからファイル名を取得する必要があります。VS2012 と C++ を使用しています。問題を説明するために、簡単なコードの小さなサンプルをまとめました。
PDB ファイルを調べて、別々のコンパイルで x と xx の 2 つのインスタンスを区別するのに十分な情報を取得する方法が必要です。
dia2dump ( https://msdn.microsoft.com/en-us/library/b5ke49f5.aspxから)というプロジェクトをダウンロードして少し遊んでみました。 IDiaSymbol に関する MSDN の「ドキュメント」には、コンテキストがほとんどなく、意味のあるコード例がほとんどありません。
シンボル x と xx をソース ファイル名に関連付ける良い方法はないようです。
IDiaSymbol* pSymbol を取得できますが、実際に必要なものを提供しているように見えるさまざまな関数はすべて S_FALSE を返します。
dia2dump に挿入したコードの一部を次に示します。
get_sourceFileName() が有用なものを返さない理由の手がかりを見つけることができませんでした。
私は、1) 間違った場所を探しているか、2) Debug Interface Access DLL を作成したプログラマーが、匿名名前空間のシンボルにその機能を実装するのに十分なほど重要であるとは考えていなかったと推測しています。私がなんとか見過ごしたことが何であれ、そこにいる誰かが指摘できるように、それが#1であることを願っています.
無知をからかっても構いませんが、有益な情報を提供していただければ...
c++ - 匿名名前空間で可変個引数テンプレート ヘルパーを呼び出す方法は?
以下のコードでは、foo
誰でもアクセスできる関数である必要がありますが、アクセスできfoo_helper
ないため、匿名の名前空間に配置しました。明らかに、この例ではインクルード ガードとインクルードを除外していますが、それらは存在します。
foo.h
:
foo.cpp
:
問題は、foo_helper
の可変個引数テンプレートが機能するためには、引数のない初期バージョンが必要なことです。ただし、これにより、テンプレート以外の関数をヘッダー ファイルとして定義する必要があり、このファイルを複数のソース ファイルに含めると壊れてしまいます。の定義をfoo_helper
ソース ファイルに移動できません。これは、匿名の名前空間にあり、アクセス可能であることが想定されていないためです。
この問題を解決する方法はありますか?
c++ - 名前のない名前空間内の名前の外部リンケージ
C++ 標準の 3.5/4 節によると、次のようになります。
名前のない名前空間、または名前のない名前空間内で直接的または間接的に宣言された名前空間には、内部リンケージがあります。
同時に、パラグラフ 7.3.1.1 には注記 96) があります。
名前のない名前空間内のエンティティは外部リンケージを持っている可能性がありますが、それらは翻訳単位に固有の名前によって効果的に修飾されているため、他の翻訳単位からは決して見ることができません。
名前のない名前空間内の名前の外部リンケージを明示的に作成する方法と、別の翻訳単位から名前のない名前空間内で定義された名前にアクセスする方法がないことが標準で保証されている場合、リンケージが実際に外部であることを確認する方法は?
名前のない名前空間内の名前に対して明示的な外部リンケージを行うことが役立つのはどのような場合ですか?
c++ - 名前の競合、名前のない名前空間、クラス テンプレート
Foo<T>
から派生したクラステンプレートがありFooBase
ます。
フー.h:
次に、異なる で Foo をインスタンス化する 2 つの翻訳単位がありますT
。テンプレート パラメーターとして使用されるクラスはT
、両方の翻訳単位で呼び出されますが、名前のない名前空間によって保護されています。各翻訳単位は自由関数を定義します。
Test1.h:
Test1.cpp:
Test2.h:
Test2.cpp:
最後に、両方の free 関数を呼び出す main を用意し、3 つの翻訳単位すべてをリンクします。
main.cpp:
質問: これは合法的な C++11 ですか?
名前の競合は名前のない名前空間によって解決されるため、そうあるべきだと思いました。ただし、次の理由により、私は今疑問に思っています。
- GDB (v7.7.1、Kubuntu 14.04 64 ビット) はこれについて本当に混乱しています
- 実際のケースには追跡できない奇妙なバグがあります
GDB
GDB は test2() で次の警告を発行します。
And はbase
実際に動的な型Foo
であると判断できないため、その member を調べますt
。また、素敵な代わりに
これは test1 で得られ、test2 では次のようになります。
さらに悪いことに、foo.t
test1 を検査foo.t.x
すると、test2 にのみ存在するはずのメンバーが検出されます。
QtCreator 内のスクリーンショットについては、以下を参照してください。
T1
Test1.cpp と Test2.cpp でテンプレート パラメーターに名前を付けると、上記の問題はすべて解決されますT2
。
GDB の混乱にもかかわらず、この最小限の例で試したすべてのバリアントで、プログラムは常に正しく動作するようです (GCC 4.8.2)。たとえば、 base から呼び出された仮想メソッドを介して sizeof(T) を印刷すると、 test1 と test2 に対してそれぞれ正しく返さ1
れ4
ます (印刷中に名前のない名前空間を削除する1
と1
、実際の名前の競合が原因で、コードが合法的な C++ ではないことがわかっています)。 )。
実際のケース
私の実際のケースでは、次のセグメンテーション違反があります。
- 常に「グローバルスコープで同じ名前」で発生します(明らかに)
- 「名前のない名前空間の下の同じ名前」で予期せず発生します
- 手動で割り当てられた一意の名前では発生しませんでした
一意の名前を手動で割り当てることで問題が修正されたからなのか (名前のない名前空間に既にあったので修正できるのでしょうか??)、それとも私のコードがまだ別の場所で壊れていて、私が単に「運が良かった」だけなのかはわかりません (つまり、非常に恐ろしい隠れた未定義の動作です)。この方法でまだクラッシュするが失敗する最小限の例に減らすために 2 日間を費やしました。動作する最小限の例、または時々クラッシュする実際のコードしか取得できませんでした。
c++ - 名前のない名前空間の不必要な使用 C++
会社のいたるところで次のようなコードを目にします。
ここで匿名の名前空間が必要な理由がわかりません。一方では、MAX_LIMIT
ANDのローカル翻訳単位が必要ですTOKEN
。しかし、それはconst
. static const
とシンプルconst
の両方がローカル翻訳単位を達成します。
一方、ファイルのどこかに同じ名前の変数がある場合、名前の衝突はありません。
それは匿名の名前空間を正当化します。const
しかし、関数の外部で宣言された変数によって実際に既に使用されている変数名が関数内で必要になる頻度はどれくらいですか? 私の答えは決してありません。したがって、実際には、名前のない名前空間は必要ありません。ヒントはありますか?
c++ - 名前のない名前空間からのパラメーターを使用した関数のリンク
関数のシンボルは、明らかに、一意に名前が付けられた名前空間のメンバーである A の名前を参照します (これにより)。
fooのリンケージは何ですか?