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

Multiple double colon (::) in call stack of VS 2010 C++

我来自 java/C# 背景,我正在尝试理解一些 C++ 代码。我了解到像下面这样的代码是从 class 文件

中定义一个函数
Some_Class::someFunction ( void ){
//SOME LINE
//OF CODE
//FOR THIS FUNCTION
}

我正在使用 Visual Studio 2010 构建项目。但是,当我调试它以了解流程时,我在 VS 的调用堆栈中看到类似 abc::def::ghk::The_Class::theFunction() at line 999 的内容。现在,我可以在 class 文件 Strange.cxx.

中找到 The_Class::theFunction( void ){//SOME CODE} 定义

根据我的学习,我认为 abc、def 和 ghk 是 classes 但我找不到像 class abc 或 class def.[=14= 这样的定义]

我的问题是为什么VS中的Call Stack会这样显示,它们是什么purpose/meaning?

::就是scope resolution operator。我想这不会对你有太大帮助,所以我会尽量用简单的方式来表达。

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

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

的 class 中
struct ghk {
    struct The_Class {
        void The_Function();
    };
};

您可以在嵌套的 class 中嵌套 class 直到医生来。

接下来,C++ 使用namespaces 来组织名称。例如,所有标准库都在命名空间 std 中,boost 库将其名称放在命名空间 boost 中。通过这种方式,你可以在 boost 中有一个 foo,在标准库中有一个 foo,你仍然可以区分它们,因为它们的全名是 boost::foostd::foo。命名空间也可以嵌套。

The_Function 的一个假设声明可以是

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

My question is why Call Stack in VS show like this ...

因为调用堆栈向您显示了您来自的完全限定函数符号。

... and what's their purpose/meaning?

由双冒号分隔的符号部分的多次出现 ::,表示 class 或函数声明嵌入到命名空间或另一个 class,例如:

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

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

或混合

namespace abc {
    namespace def {
        class ghk { // No namespace definitions allowed inside.
            class The_Class {
                void The_Function();
            };
        };
    }
}

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