我们知道,在c++中,函数是可以重载的,也就是说函数名相同,但参数不同。那么编译器和链接器是怎样区分两个同名的函数的呢?由目标文件的三魂七魄(如果不清楚可以看看这边文章)可以知道,函数名和变量名都是符号(symbol),正是c++的符号修饰(name decoration)机制支持了这种特性。

在c中,现在gcc编译器,函数名的符号一般都是函数名本身,所以c没有函数重载这样的特性。

下面,通过一个实例来说明符号修饰机制

通过g++ -c test.cpp -o test.o编译后,再使用readelf -s test.o查看test.o的符号表信息。

可发现,所有的函数的符号修饰都是以"_Z"开头。

第17、18行的两个函数名分别为_Z4funci_Z4funcf;4 表示函数名的字符个数,i和f分别表示函数的形参的数据类型;

第32行的函数名为_ZN1A4funcEi,因为该函数是类A的函数,所以_Z后紧跟一个N,接着是类名的长度,本例中类名A只有一个字符,所以长度为1;对于在命名空间或类里面的函数,它的符号修饰是以E结尾,紧接着跟函数的形参数据类型。

也就是说,在namespace或class内部定义的函数,被修饰后的函数名是以N开头,以E结尾,中间的修饰名称由**[命名空间字符长度][命名空间名][类名字符长度][类名]函数名长度 函数名** 组成。

函数签名可以通过c++filt命令查看

函数签名(function signature)包含函数名、函数参数类型、所在类及命名空间的信息。

CLL-符号修饰与函数签名相关推荐

  1. C++ 符号修饰和函数签名

    前言: (这部分讲的是历史.由来,不想了解的可跳过) 约在20世纪70年代以前,编译器编译源代码产生目标文件时,符号名与相应的变量和函数的名字是一样的.比如一个汇编源代码里面包含了一个函数foo,那么 ...

  2. C++符号修饰与函数签名

    很久以前在一个汇编源代码里包含一个函数foo,那么汇编器将它编译成目标文件以后,foo在目标文件中的相对应的符号名也是foo. 当后来Unix平台和C语言出现后,已经存在了相当多的汇编编写的库和目标文 ...

  3. c, c++函数名编译符号修饰符说明

    C++ 编译器的函数名修饰规则 函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串.用来指明函数的定义或原型. LIN ...

  4. C++学习笔记(十)成员变量和成员函数分开存储、this指针、空指针访问成员函数、const修饰成员函数、友元

    1.成员变量和成员函数分开存储 //1.在C++中,类内的成员变量和成员函数分开存储 //2.只有非静态成员变量才属于类的对象上 //空对象占用内存空间为:1 //C++编译器会给每个空对象也分配一个 ...

  5. Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]

    1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...

  6. python3 函数签名简介 验证函数参数

    一个函数或方法,它使用*args和**kwargs作为参数,这样使得它比较通用, 但有时候你想检查传递进来的参数是不是某个你想要的类型.可以使用函数签名来做验证 函数签名对象,表示调用函数的方式,即定 ...

  7. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  8. 浅谈python函数签名

    函数签名对象,表示调用函数的方式,即定义了函数的输入和输出. 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名. 获取函数签名及参数 使用标准库的signature方 ...

  9. inline修饰虚函数问题

    inline修饰虚函数问题 虚函数是否可以内联? 虚函数是否可以内联? 一般来说,inline是编译时的行为,虚函数是在程序执行时的行为,因此编译器一般会拒绝对虚函数进行内联! 该博文为原创文章,未经 ...

最新文章

  1. 事务隔离机制原理深入分析以及MySQL不同隔离级别分场景下实验对比
  2. centos7.2安装mysql
  3. CentOS 6.7 Gitolite 服务搭建及TortoiseGit配置连接
  4. Android笔记一.深入理解Intent和IntentFilters(一)
  5. 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)
  6. a标签hidden属性_HTML5属性a标签ping被用于DDOS攻击,QQ浏览器被波及
  7. Hash Length Extension Attacks
  8. python找出矩阵中的马鞍点_矩阵的马鞍点
  9. 我们都在深夜,参差不齐地入眠
  10. 剑指offer面试题[30]-最小的k个数
  11. IS-IS详解(七)——IS-IS LSP报文详解
  12. 楼主,不知道为什么这么流行
  13. android获得手机目录,关于android手机文件目录的收集
  14. 将iTunes音乐传输到USB驱动器以在汽车中收听
  15. 地产行业主数据建设项目思考
  16. ubuntu如何安装rpm
  17. Arx常用代码《转》
  18. 元素JavaScript知识点梳理与经典百例
  19. Android中使用AudioManager实现按键录音并保存以及点击播放功能
  20. Java架构师大型互联网高级技术视频教程

热门文章

  1. A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection
  2. JavaStudy7(18章-坦克大战2)—B站韩顺平
  3. html音乐播放器论文,基于HTML5技术的音乐播放器的设计与实现.docx
  4. 音视频应用开发系列文章目录
  5. Go语言日志库zerolog
  6. Dart开发(一)Windows平台环境搭建
  7. 第五周-css3重点总结
  8. 【软件测试】移动端测试金字塔
  9. java 进阶(持续补充)
  10. Jetbrains 全家桶 配置