C ++:如何获取变量的路径?

时间:2013-07-24 07:29:30

标签: c++ naming-conventions

我想知道是否可以(在运行时)获得C ++程序中每个变量的唯一名称。 例如,如果在主要我声明

MyClass A;

并在MyClass中声明

int I;

我想要一个神奇的论坛,返回类似“main / 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,但是如何将地址映射到人类可读的路径呢?

3 个答案:

答案 0 :(得分:1)

除非你正在做一些额外的工作(在声明数据结构时),否则在C ++中这是不可能的。程序中的任何地方都没有存储此类数据。

事实上,正如其中一位评论者提到的,在某些情况下,如果您有调试数据(如Windows中的pdb),则可能采用特定于平台的方式,您可以像调试器那样执行此操作。

答案 1 :(得分:0)

绝对不是你所描述的意义上的。你想要的是拥有一个由其整个继承层次结构标识的变量,这是参考站点的用途,并且在程序中包含这些信息只会增加重要的性能问题。

如果您只是想要一个唯一的标识符来使您的程序中的每个变量都可识别和全局,请认真重新考虑这一点。这是非常糟糕的设计,更不用说练习,并会导致很多很多烦人的错误。

然而,这可能就是你所要求的:

“我可以列出特定程序X的变量类结构吗?”

你可以。但它可能比你想要的更多的工作,C ++没有内置这样的东西,但它可能存在于某个地方,但如果它确实存在,我不知道。为此,您可以使解析器将您的代码解析为解析树,并使用访问者模式遍历树,在附加父叶子的情况下打印出每个变量。这是您可以通过调试器看到的信息(不是变量,而是每个编译器解析并构造一个解析树然后在其上执行),这是调试器在运行时构建的保存,因此您可以“回溯”它,您实际上是通过你的程序解析树回来了。

答案 2 :(得分: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 / i 14 MyClassDerived / i

如果它能解决您的问题,请告诉我。