栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

以如下一段代码为例:

int f(int i) { return i; }
int f(void)  { return 0; }
int g(void)  { return f() + f(1); }
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)"
Linux 查看装饰后的名字
$ g++ -c test.cpp
$ nm test.o
0000000000000000 T _Z1fi
0000000000000010 T _Z1fv
000000000000001f T _Z1gv
通过装饰后的名字查看未装饰名字
$ c++filt -n _Z1fi
f(int)

参考:

  • Decorated Names
  • Name mangling
  • Calling conventions
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号