C++ name mangling(命名粉碎规则) 编译器的函数名修饰规则

name mangling跟函数重载紧密相关。mangling的目的就是为了给重载的函数不同的签名,因此调用函数的时候才好确认。

不同的编译器可能规则不一样。
举个例子。

原文件 main.cc:

/// @author zhaolu
/// @file main.cc

namespace zhao {
    class test {
    public:
        void func();
    };
};

void zhao::test::func() {}

void func(){}

void func(int){}

void func(int,int){}

void func(char){}

void func(zhao::test* pointer){}

输入编译命令,生成目标文件:

g++ -c main.cc -o main.o

使用nm命令可以列出目标文件的符号:

nm main.o

可以看到:

192:~ lurongming$ nm main.o
0000000000000050 T __Z4funcPN4zhao4testE
0000000000000040 T __Z4funcc
0000000000000020 T __Z4funci
0000000000000030 T __Z4funcii
0000000000000010 T __Z4funcv
0000000000000000 T __ZN4zhao4test4funcEv

分别对应文件中声明的:

void func(zhao::test*)
void func(char)
void func(int)
void func(int, int)
void func()
void zhao::test::func()

所以大致可以推出规则:

  • 编码后的符号由__Z开头
  • 如果有作用域符,则在_Z之后加上N
  • 再是 [命名空间名字长度+命名空间名字+类名字长度+类名字+] 函数名称长度+函数名称
  • 如果有作用域符,则以E结尾
  • 最后加上函数形参符号,void是v,int是i,char是c,P代表指针,有几个形参就写几个符号

推荐一个linux下的工具,c++filt,可以将解析后的符号还原:

192:~ lurongming$ nm main.o | cut -d " " -f 3,3 | c++filt
func(zhao::test*)
func(char)
func(int)
func(int, int)
func()
zhao::test::func()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值