zoukankan      html  css  js  c++  java
  • Chap-3 Section 3.6 符号修饰和函数签名

    C++符号修饰
    C++拥有类、继承、虚机制、重载、名称空间这些特性,使得符号管理更加复杂。例如:针对如下
    两个函数fun(int)和fun(double),函数名字相同,但是参数不同,这是C++里面函数重载的最简单
    的一种情况,那么编译器和链接器在链接过程中是怎样区分这两个函数呢?为此,C++引入了符号
    修饰(Name Decoration)和符号改编(Name Mangling)。
    比如有如下代码:
    //nameDe.c
    int func(int);
    float func(float);
    class C {
    int func(int);
    class C2 {
    int func(int);
    };
    };
    namespace N {
    int func(int);
    class C {
    int func(int);
    };
    };

    这段代码中又6个同名的函数func,只不过它们的返回类型和参数以及所在的名称空间不同,由此
    引入了一个术语函数签名(Function Signature),函数签名包含了一个函数的信息,包括函数名、
    参数类型、所在的类和名称空间以及其他信息,在编译器和链接器处理符号时,它们使用某种名称
    修饰方法,使得每个函数签名对应一个修饰后名称。C++编译器和链接器都使用符号来识别和处理
    函数和变量,所以对于不同函数签名的函数,即使函数名相同,编译器和链接器都认为他们是不同
    的函数。上面6个函数签名在GCC编译器下,相对应的修饰后名称为:
    int func(int) _Z4funi
    float func(float) _Z4funcf
    int C::func(int) _ZN1C4funcEi
    int C::C2::func(int) _ZN1C2C24funcEi
    int N::func(int) _ZN1N4funcEi
    int N::C::func(int) _ZN1N1C4funcEi

  • 相关阅读:
    Coolite comboBox控件动态显示树形结构(无限树)
    WinXP 允许搜索PHP格式
    LINQ To DataSet 几个常用示例
    在Windows系统上安装PHP工作环境
    将LINQ To DataSet 传回之对象集转成DataTable的函数
    .net wsdl文件用法
    上班了,抱怨一下
    写在情人节
    快乐云南行
    单车骑天下 VS 公益旅游活动
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3502873.html
Copyright © 2011-2022 走看看