问题描述
我来自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::foo
和std::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的目的完全相同:
区分类名不要出现在不同的名称空间/包中。