3

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

MyClass A;

在 MyClass 我声明

int I;

我想要一个返回“main/A/I”之类的魔法论坛。

这样的事情存在吗?

谢谢!


这样做的目的是跟踪变量分配。我写了一个类,用作标准数据类型的包装器。此类的构造函数接受一个字符串,以标识每个变量。

当我在一个类中声明一个变量以及这个类的多个实例时,就会出现问题。IE

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

...

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

静态初始化数据名称将无法区分 a.data 和 b.data。正如有人建议的那样,我可以使用内存地址作为 ID,但是如何将地址映射到人类可读的路径?

4

3 回答 3

1

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

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

于 2013-07-24T07:46:54.453 回答
0

绝对不是你描述的那种感觉。听起来您想要的是有一个由其整个继承层次结构标识的变量,这是参考站点的用途,并且在程序中拥有这些信息只会增加重要的性能问题。

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

但是,这可能是您要问的:

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

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

于 2013-07-24T07:59:38.277 回答
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

让我知道它是否解决了您的问题。

于 2013-07-24T08:18:11.577 回答