2013-07-24 89 views
3

我想知道是否有可能(在運行時)獲取C++程序中每個變量的唯一名稱。 例如,如果在主我宣佈C++:如何獲取變量的路徑?

MyClass A; 

和MyClass中我宣佈

int I; 

我想一個神奇的forumla返回類似 「主/ A/I」。

是否存在這樣的事情?

謝謝!


這樣做的目的是跟蹤變量賦值。 我寫了一個類,用作標準數據類型的包裝。這個類的構造函數接受一個字符串來標識每個變量。

當我在類中聲明瞭一個變量以及此類的多個實例時,會發生此問題。 也就是說

class MyClass { 
... 
MyInt data ("variable_name"); // MyInt is the wrapper for int 
... 
}; 

... 

int main() { 
... 
MyClass a; 
MyClass b; 
... 
} 

靜態初始化數據的名稱將無法在a.data和b.data之間進行撲滅。 正如有人建議,我可以使用可能使用內存地址作爲ID,但如何將地址映射到人類可讀的路徑?

+7

你實際試圖解決什麼問題? – Henrik

+0

這是什麼意思? – Rapptz

+0

不,像這樣的東西不存在(以核心語言)。 –

回答

1

除非你做了一些額外的工作(當聲明數據結構時),通常這在C++中是不可能的。程序中沒有任何地方存儲這樣的數據。

事實上,作爲評論者之一提到,在某些情況下,如果您有調試數據(如Windows中的pdb),則採用平臺特定的方式,您可以像調試器那樣做。

0

絕對不是你描述的意義。聽起來你想要的是有一個變量由其整個繼承層次結構標識,這是參考站點的用途,並且在程序中使用這些信息只會增加重要的性能問題。

如果您只是想要一個唯一的標識符,以使您的程序中的每個變量都可以識別並全局識別,請認真重新考慮這一點。這是非常糟糕的設計,更不用說練習了,並且會導致許多很多惱人的bug。

然而,這可能是你問:「我可以列出特定程序X的我變的階級結構」

您可以。但是它可能比你想要的更多的工作,C++沒有內置這樣的東西,但它可能存在於某處,但如果它確實存在,我不知道。爲了做到這一點,你可以讓解析器將你的代碼解析爲一個解析樹,並使用訪問者模式遍歷樹,並將每個變量打印出來,並將父變量附加到它上面。這是通過調試器可以看到的信息(不是變量,但是每個編譯器都會解析並構建一個解析樹,然後在其上執行),這是調試器在運行時構建的保存內容,因此您可以通過它「回溯」實際上是通過你的程序解析樹回來的。

0

不太清楚你想實現什麼,根據我的知識,沒有C++函數會給你細節,你必須自己編寫功能,我給一些代碼片段,不知道它是否會有所幫助:

class MyClass 
{ 
     public: 
     MyClass(int z) : i(z) 
     { 
     } 
     const char* getType() 
     { 
      return typeid(i).name(); 
     } 
    private: 
     int i; 
}; 

class MyClassDerived:public MyClass 
{ 
    public: 
     MyClassDerived(int k):MyClass(k) 
     {   
     } 
}; 

int main() 
{ 
    MyClass *m = new MyClass(10); 
    cout<< typeid(*m).name() << "/" << m->getType()<< endl; 

    MyClassDerived *m1 = new MyClassDerived(20); 
    cout<< typeid(*m1).name() << "/" << m1->getType(); 
    return 0; 
} 

` 的出放爲:

7 MyClass的/我 14 MyClassDerived /我

讓我知道,如果它解決您的問題。