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::foo
和 std::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 出现在不同名称空间/包中的名称。
我来自 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
:
struct ghk {
struct The_Class {
void The_Function();
};
};
您可以在嵌套的 class 中嵌套 class 直到医生来。
接下来,C++ 使用namespaces 来组织名称。例如,所有标准库都在命名空间 std
中,boost 库将其名称放在命名空间 boost
中。通过这种方式,你可以在 boost 中有一个 foo
,在标准库中有一个 foo
,你仍然可以区分它们,因为它们的全名是 boost::foo
和 std::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 出现在不同名称空间/包中的名称。