• 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

  • 相关阅读:
    (2)javascript的基本语法、数据结构、变量
    (1)认识javascript
    CSS 浅析position:relative/absolute定位方式
    jquery实现下拉框多选
    Vue.js not detected
    手机代理调试Charles Proxy和Fiddler
    render函数之jsx应用
    vue组件通信方式(多种方案)
    点击页面空白处地方,隐藏弹窗
    css圆角不圆和1px方案
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3502873.html
Copyright © 2020-2023  润新知