对于C++编译器命名粉碎规则(name mangling)机制的实验

编译器版本

在这里插入图片描述

测试案例

#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::endl;


void print(int a) //_Z5printi
{

}

double print(double,double,int,int) //_Z5printddii
{
        return 0;
}

int print(int , int ,double,bool,char,short) //_Z5printiidbcs
{
        return 0;
}
string print(string, int, int, string) //_Z5printNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiiS4_
{
        return string();
}


int main()
{

        return 0;
}

查看编译之后函数符号变化

在这里插入图片描述

结论

C++函数重载机制其实是编译器后面所做的name mangling,实际上所有的函数名字符号都不一样,否则必定二义性(汇编中符号可以看做一个地址,如果不同作用的函数共用一个符合那么只能说明这2个函数必然完全等同就是同一个)。并且我们也能够从中窥探一番编译器是如何对函数进行命名的,即:

_xx + 函数名称 + 参数类型

并且我们可以得知如果是内置类型通常为类型的首字母。如果是类,以标准库string类为例子,那么会明确的指明到的是哪个具体的类,因为标准库中string的实现是十分复杂的,最终是指向一个名为basic_string的类,因此后面那一大串的东西其实用于指明是string的最终依赖,同时参数不同类型的排列方式也会影响命名,并且函数命名与函数返回值毫无关系。

产生的问题

最明显的就是C和C++混合编程时可能导致未定义的问题,因为C函数编译后的符号命名并不遵循C++编译器的玩法,使用直接使用C函数会导致些问题。因此问了解决C函数在C与C++编译器之间的共通需要如下声明C函数:

#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus

//C函数声明或者定义

#ifdef __cplusplus
}
#endif //__cplusplus

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值