名前のない名前空間の変数に対応する PDB ファイルからファイル名を取得する必要があります。VS2012 と C++ を使用しています。問題を説明するために、簡単なコードの小さなサンプルをまとめました。
// file: unnamed_namespace1.cpp Minimal test for anonymous namespace symbols
namespace {
float x;
static float xx;
}
int unnamed_namespace1(int data) {
x = 1.0f;
if (data == 0) {
// Computation
xx = x;
} else {
xx = 0.0;
}
return 1;
}
// file unnamed_namespace2.cpp Minimal test for anonymous namespace symbols
namespace {
float x;
float y;
float z;
static float xx;
static float yy;
static float zz;
}
int unnamed_namespace2(int data) {
x = 1.0f;
if (data == 0) {
// Computation
xx = x;
} else {
xx = 0.0;
}
return 2;
}
// file main.cpp
#include <iostream>
using std::cout;
using std::endl;
int unnamed_namespace1(int data);
int unnamed_namespace2(int data);
int main(int /* argc */, char** /* argv */) {
int r1 = unnamed_namespace1(0);
cout << "r1=" << r1 << endl;
int r2 = unnamed_namespace2(1);
cout << "r2=" << r2 << endl;
}
PDB ファイルを調べて、別々のコンパイルで x と xx の 2 つのインスタンスを区別するのに十分な情報を取得する方法が必要です。
dia2dump ( https://msdn.microsoft.com/en-us/library/b5ke49f5.aspxから)というプロジェクトをダウンロードして少し遊んでみました。 IDiaSymbol に関する MSDN の「ドキュメント」には、コンテキストがほとんどなく、意味のあるコード例がほとんどありません。
シンボル x と xx をソース ファイル名に関連付ける良い方法はないようです。
IDiaSymbol* pSymbol を取得できますが、実際に必要なものを提供しているように見えるさまざまな関数はすべて S_FALSE を返します。
dia2dump に挿入したコードの一部を次に示します。
BSTR bstrFname;
if (pSymbol->get_sourceFileName(&bstrFname) == S_OK) {
wprintf(L"fn:%s ", bstrFname); // <== never gets here
SysFreeString(bstrFname);
}else{
wprintf(L"no fn "); // <== this is always printed
}
get_sourceFileName() が有用なものを返さない理由の手がかりを見つけることができませんでした。
私は、1) 間違った場所を探しているか、2) Debug Interface Access DLL を作成したプログラマーが、匿名名前空間のシンボルにその機能を実装するのに十分なほど重要であるとは考えていなかったと推測しています。私がなんとか見過ごしたことが何であれ、そこにいる誰かが指摘できるように、それが#1であることを願っています.
無知をからかっても構いませんが、有益な情報を提供していただければ...