我使用 vs12 将以下 c++ 代码编译成 Program.exe
class foo
{
public:
foo()
{
std::cout << "in ctor\n";
}
~foo()
{
std::cout << "in dtor\n";
}
std::string s;
};
int main()
{
foo f{};
}
然后我转到“Tools->Launch Under Debugger...”并在调试器即时窗口中键入以下命令
x program!*foo*
这给了我以下输出
0:000> x program!*foo*
00007ff6`11ce4b00 Program!foo::~foo (void)
00007ff6`11ceaef0 Program!`foo::~foo'::`1'::dtor$0 (void)
00007ff6`11ce48f0 Program!foo::foo (void)
00007ff6`11ceae90 Program!`foo::foo'::`1'::dtor$0 (void)
我知道第一个输出是 foo
的析构函数,第三个是 foo
的构造函数。第二个和第四个(带反引号的)是什么?更一般地说,我可能会在用户模式调试器中看到反引号的其他地方是什么?
有趣的是,如果完成以下任一操作,反引号功能就会消失
- 删除
std::cout
语句 - 移除
std::string s
- 在构造函数和析构函数前加上
throw()
关键字
这似乎表明反引号函数与异常处理有关
最佳答案
这些是 Microsoft 编译器为“胶水”函数生成的内部名称,这些函数有助于将事物组合在一起,但不直接对应于源代码行。这是正常的。
在其他情况下,您会看到带有反引号的类似内部名称,例如使用 lambda 函数,或调用在另一个函数内的结构内声明的函数。
其他编译器有不同的方式来表示类似的无名代码块;该标准并未在此处规定任何特定行为,并且无论如何只能通过调试器观察到。
关于c++ - vs 用户模式调试器中的反引号是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264712/