第9课 函数重载分析(下)

本文内容取自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结

重载与指针

在这里插入图片描述

函数重载遇上函数指针
  • 重载函数名赋值给函数指针
    1.根据重载规则挑选与函数指针参数列表一致的候选者
    2.严格匹配候选者的函数类型与函数指针的函数类型

编程实验

函数重载VS函数指针
#include <stdio.h>
#include <string.h>

int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}

typedef int(*PFUNC)(int a);


int main(int argc, char *argv[])
{
    int c = 0;

    PFUNC p = func;
        
    c = p(1);   
    
    printf("c = %d\n", c);

    return 0;
}

运行结果
在这里插入图片描述

根据实验结果,可以看出,根据函数指针类型int(*PFUNC)(int a),
匹配到的重载函数是int func(int x)

注意

  • 函数重载必然发生在同一个作用域中
  • 编译器需要用参数列表函数类型进行函数选择
  • 无法直接通过函数名得到重载函数的入口地址



C++和C相互调用

  • 实际工程中C++和C代码相互调用 是不可避免的

  • C++编译器能够兼容C语言的编译方式

  • C++编译器会优先使用C++编译的方式

  • extern 关键字能强制让C++编译器进行C方式 的编译

     extern "C"
     {
     		// do C-style compliation here
     }
    

问题

如何保证一段C代码只会以C的方式被编译?



解决方案

  • __cpluspls是C++编译器内置的标准宏定义
  • __cpluspls的意义
    确保C代码以统一的C方式被编译成目标文件
    在这里插入图片描述


注意事项

  • C++编译器不能以C的方式编译重载函数
  • 编译方式决定函数名被编译后的目标名
    1.C++编译方式将函数名和参数列表编译成目标名
    2.C编译方式只将函数名作为目标名进行编译



小结

1.函数重载是C++对C的一个重要升级
2.函数重载通过函数参数列表区分不同的同名函数
3.extern关键字能够实现C和C++的相互调用
4.编译方式决定 符号表中的函数名的最终目标名

发布了42 篇原创文章 · 获赞 0 · 访问量 991

猜你喜欢

转载自blog.csdn.net/lzg2011/article/details/104344169
今日推荐