c++函数重载 函数名修饰 extern “C“

c++函数重载 函数名修饰 extern “C”

函数重载

基本的函数重载

函数名相同 参数不同(数量或者类型或者顺序)

    double Add(int left ,double right)//原函数
    {
        reurn left+right;
    }
    double Add(double left, double right)//函数名相同类型不同
    {
        reurn left+right;
    }
    double Add(int left, double right,int ret)//函数名相同数量不同
    {
        reurn left+right+ret;
    }
    double Add(double left ,int right)//函数名相同顺序不同
    {
        reurn left+right;
    }

返回值不同不能构成函数重载

   int add(int a ,int b)
   {
        return a+b;
   }
   double add(int a, int b)
   {
        return a+b;
   }

为什么c语言没有重载?(函数名修饰)

构建C程序需要4个步骤
假设一个项目有如下三个文件
list.h list.c test.c
1.预处理/预编译 -> 头文件的展开、宏替换、条件编译、去掉注释
list.i test.i
2.编译-> 检查语法 生成汇编代码
list.s test.s
3.汇编-> 把汇编代码转成二进制的机器码
list.o test.o
4.链接->将两个目标文件链接到一起生成可执行文件
一个函数的地址在定义的文件的符号表中,链接需要访问调用的文件获取函数地址。
c语言二进制机器码中直接用函数名
c++则是用了函数名修饰对函数名进行编码存储
比如c++中会把函数名这样修饰
add(int a ,int b) -> _Z3addii 3是名字长ii是参数类型首字母
Func(int a , int b ,int c)_Z4Funciii
而调用函数 add(1,2)对应的汇编是
call _Z3addii(?)
add(1.1,1.2)
call _Z3adddd(?)
链接就是在文件中找到这个问号是个啥,就是根据函数名称找到函数的地址。

所以总结一下就是cpp中多了一个叫函数名修饰的东西,所以虽然我们定义的函数名都一样但编译器还会根据函数的参数对函数进行修改,因此c++可以重载,c不能,而这种命名都是根据参数的多少顺序来命名,所以函数返回值不同并不能够进行重载。

extern “C”

说明

一般用c++实现的代码 可以编译成动态/静态库供c++用
而一个c程序想要调用c++里面的东西时会出现问题
比如cpp实现 void *tcmalloc(size_t n)
cpp会用 call Z8tcmallocui(?)去找函数的地址(函数名修饰)
而c语言会直接 call tcmalloc(?)去找函数的地址
若想c与cpp都能找到这个函数
extern “C” void *tcmalloc(size_t n)
加了extern "C"之后就按照c的规则在修饰完的符号表中进行命名
###extern "c"之后依旧可以重载,但是会有影响
如c++实现

  void  func(int a)
   extern "C"   void func(double b)

这两个函数在符号表中的名字是不一样的
但是
extern “C” void func(double b)
extern “C” void func(double b,int a)
这样缺会报错 因为两个都按照c的命名规则进行命名 符号表对其调用时名字相同会报错

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值