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

C++: how to get the path of a variable?

本文关键字:变量 路径 获取 何获取 C++      更新时间:2023-10-16

我想知道是否有可能(在运行时)为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,但如何将地址映射到人类可读的路径?

除非您正在做一些额外的工作(在声明数据结构时),否则这在C++中通常是不可能的。程序中的任何位置都没有存储这样的数据。

事实上,正如一位评论者所提到的,在某些情况下,以特定于平台的方式,如果你有调试数据(比如windows中的pdb),你可能可以像调试器一样做到这一点。

绝对不是你所描述的意义。听起来你想要的是通过其整个继承层次结构来识别一个变量,这就是参考站点的用途,而在程序中包含这些信息只会增加显著的性能问题。

如果你只想用一个唯一的标识符来使程序中的每个变量都是可识别的和全局的,那么认真思考一下。这是一个非常糟糕的设计,更不用说实践了,会导致很多很多令人讨厌的错误。

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

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

你可以。但它可能比你想要的工作更多,C++没有内置这样的东西,但它可能存在于某个地方,但如果存在,我不知道。要做到这一点,你可以让解析器将你的代码解析成一个解析树,并使用访问者模式遍历该树,在每个变量到达时打印出它,并将父叶附加到它上面。这是你可以通过调试器看到的信息(不是变量,而是每个编译器解析并构建一个解析树后在上面执行),这是调试器在运行时构建时保存的内容,这样您就可以"返回"它,实际上您正在返回程序解析树。

不太确定你想要实现什么,据我所知,没有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/i14 MyClassDerived/i

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