vs用户模式调试器中的反勾符号是什么 < >我用VS12将以下C++代码编译成代码>程序.exe < /代码> class foo { public: foo() { std::cout << "in ctor\n"; } ~foo() { std::cout << "in dtor\n"; } std::string s; }; int main() { foo f{}; }

vs用户模式调试器中的反勾符号是什么 < >我用VS12将以下C++代码编译成代码>程序.exe < /代码> class foo { public: foo() { std::cout << "in ctor\n"; } ~foo() { std::cout << "in dtor\n"; } std::string s; }; int main() { foo f{}; },c++,visual-studio,debugging,C++,Visual Studio,Debugging,这给了我以下输出 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的析

这给了我以下输出

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
的构造函数。第二个和第四个是什么(有背记号的)?。更一般地说,在用户模式调试器中,我还可能在哪些地方看到反勾号

有趣的是,如果执行以下任一操作,backtick函数就会消失

  • 删除
    std::cout
    语句
  • 删除
    std::字符串s
  • 在构造函数和析构函数前面添加
    throw()
    关键字

这似乎表明backtick函数与异常处理有关

这些是由Microsoft编译器为“粘合”函数生成的内部名称,有助于将内容整合在一起,但并不直接对应于一行源代码。这是正常的

在其他情况下,您会看到类似的内部名称带有反勾号,例如使用lambda函数,或者调用在另一个函数中的结构中声明的函数


其他编译器有不同的方法来表示相似的无名代码块;该标准并不规定任何特定的行为,它只能通过调试器来观察。< /P>可能是因为它没有在C++中使用,所以选择了后台,所以它不能被任何来自C++源代码的结构所混淆。当然,有许多符号可供选择,以适合该配置文件。事实上,<代码> dor $ 0 < /COD>只是使用了 $/COD>,因为它超出了法律字符的范围。除了一些C和C++编译器允许在标识符中使用<代码> $<代码>。我不认为Dev Studio允许这样做,但显然他们允许!在C和C++中没有使用的唯一ASCII可打印字符(并且不是基本源字符集的一部分)是<代码> '$'/COD>,<代码> '' /代码>,和<代码> ''/COD>。
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)