如何解读Visual Studio调用栈中匿名Lambda的名称?数字2的含义是什么?
关于Visual Studio中Lambda调用栈里数字的含义
问题描述
在Visual Studio中跟踪匿名Lambda的调用栈一直颇具挑战,我编写了如下测试代码:
int main() { [] { std::cout << "Hello World!\n"; } (); [] { std::cout << "Hello World!\n"; } (); }
在Lambda内部设置断点后,调用栈显示内容为:
`main'::`2'::<lambda_1>::operator()() `main'::`2'::<lambda_2>::operator()()
通过测试不同函数或命名空间内的匿名Lambda,我已大致理解大部分内容,但无法理解分隔main与<lambda_1>的数字2的含义,请问这是什么意义?
解答
那个数字是MSVC编译器用来标记函数内嵌套上下文的编号。
在MSVC的实现逻辑里,编译器会给函数内部的每个独立嵌套作用域(比如代码块、Lambda定义所在的上下文)分配一个序号,用来区分同一函数里不同位置的Lambda或局部类,避免命名冲突。你例子里的两个Lambda都在main函数的顶层作用域,所以共享同一个上下文编号2——序号1通常被函数自身的内部结构占用,因此顶层的嵌套实体从2开始编号。
如果在main里增加嵌套代码块,比如:
int main() { []{/* 逻辑代码 */}(); // 调用栈会显示`main'::`2'::...` { []{/* 逻辑代码 */}(); // 调用栈会显示`main'::`3'::...` } }
这时第二个Lambda处于更深一层的嵌套上下文,对应的编号就会变成3。
内容的提问来源于stack exchange,提问作者Kaiyakha
相关产品推荐
相关产品推荐

