2013-07-24 130 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 /我

让我知道,如果它解决您的问题。