VS 2010 C ++的调用堆栈中的多个双冒号::)

问题描述

我来自Java / C#背景,我正在尝试了解一些C ++代码。我了解到,如下代码将在类文件之外定义函数

Some_Class::someFunction ( void ){
//SOME LINE
//OF CODE
//FOR THIS FUNCTION
}

我正在使用Visual Studio 2010生成项目。但是,当我调试它以了解流程时,在VS调用堆栈中看到类似abc::def::ghk::The_Class::theFunction() at line 999内容。现在,我可以在类文件The_Class::theFunction( void ){//SOME CODE}中找到Strange.cxx的定义。

根据我的学习,我认为abc,def和ghk是类,但是我找不到像abc类或def类的定义。

我的问题是,为什么VS中的Call Stack如此显示,它们的目的/意义是什么?

解决方法

::scope resolution operator。我想这对您没有多大帮助,所以我将尝试用简单的术语来表达。

abc::def::ghk::The_Class::The_Function()

这是The_Function()的全名(*)。像您的代码段一样,假设它是The_Class的一种方法。然后,该类可能嵌套在另一个名为ghk的类中:

struct ghk {
    struct The_Class {
        void The_Function();
    };
};

您可以将类嵌套在嵌套类中,直到医生来为止。

接下来,C ++使用namespaces来组织名称。例如,所有标准库都在名称空间std中,boost库将其名称放在名称空间boost中。这样,您可以在标准库中增强foo并在标准库中拥有foo,但由于它们的全名分别为boost::foostd::foo,因此您仍然可以区分它们。命名空间也可以嵌套。

一个The_Function的假设声明可能是

namespace abc {
namespace def {
struct ghk {
    struct The_Class {
        void The_Function();
    };
};
}
}
  • =技术术语是“完全限定名称”,但实际上完全限定名称前面还有另一个::。例如,::foo是在全局范围中声明的foo的名称(它没有放置在名称空间中)。
,

我的问题是,为什么VS中的Call Stack显示如下...

因为调用堆栈会向您显示您来自何处的完全合格的功能符号。

...他们的目的/意义是什么?

用双冒号#TempTable分隔的符号部分的多重显示,表示该类或函数声明已嵌入到名称空间或另一个类中,例如:

::

namespace abc {
    namespace def {
        namespace ghk {
            class The_Class {
                void The_Function();
            };
        }
    }
}

或混合

class abc {
    class def {
        class ghk {
            class The_Class {
                void The_Function();
            };
        };
    };
};

我认为Java具有same feature的目的完全相同:
区分类名不要出现在不同的名称空间/包中。