在 Windows 和 Linux 平台如何查看 C++ 名称装饰

本文介绍了C++编译器如何通过名字装饰来解决重载函数区分、声明一致性检查以及错误信息的详细性问题。通过Linux和Windows平台下的nm和dumpbin命令展示了如何查看和解码装饰后的函数名,帮助理解编译过程中的符号处理。
摘要由CSDN通过智能技术生成

名字装饰是C++编译器用来为函数和对象添加额外信息的方法。名字装饰有以下几种作用:

  1. 使链接器能够区分不同版本的重载函数。
  2. 使链接器能够检查对象和函数在所有模块中的声明方式是否完全相同。
  3. 使链接器能够在错误信息中提供关于未解析的引用类型的完整信息。

名字装饰是为了解决问题1而发明。附带解决了其他问题。

以如下一段代码为例:

int f(int i) { return i; }
int f(void)  { return 0; }
int g(void)  { return f() + f(1); }

Linux 平台

查看装饰后的名字

使用命令 nm

$ man nm
nm - list symbols from object files

完整操作如下

$ g++ -c test.cpp
$ nm test.o
0000000000000000 T _Z1fi
0000000000000010 T _Z1fv
000000000000001f T _Z1gv

通过装饰后的名字查看未装饰名字

使用命令 c++filt

$ man c++filt
c++filt - demangle C++ and Java symbols

使用示例如下

$ c++filt -n _Z1fi
f(int)

windows 平台

使用visual studio 编译上述代码得到 test.obj
首先通过 Tools > Command Line > Developer Command Prompt 打开命令行窗口

查看装饰后的名字

> dumpbin /symbols test.obj
...
024 00000000 SECT4  notype ()    External     | ?f@@YAHH@Z (int __cdecl f(int))
025 00000000 SECT6  notype ()    External     | ?f@@YAHXZ (int __cdecl f(void))
026 00000000 SECT8  notype ()    External     | ?g@@YAHXZ (int __cdecl g(void))
...

通过装饰后的名字查看未装饰名字

> undname ?f@@YAHH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?f@@YAHH@Z"
is :- "int __cdecl f(int)"

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylhw13_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值