• 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

  • 相关阅读:
    iisexpress应用讲解
    Flex document文档 下载网址:
    HDU1407 测试你是否和LTC水平一样高
    HDU1715 大菲波数 Java
    HDU1573 大明A+B Java
    HDU1063 Exponentiation Java
    HDU1754 I Hate It 线段树 链式
    HDU2054 A == B? Java
    HDU1166 敌兵布阵 不完全线段树
    HDU1698 Just a Hook 线段树 Lazy思想
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3502873.html
Copyright © 2020-2023  润新知