5函数重载与C-C++相互调用

函数重载

什么是函数重载:一组函数,函数名相同,但参数类型或个数不同。

C++为什么支持函数重载,但C不支持

  • 本质是编译器产生符号的规则不一样:C++代码产生函数符号,由函数名和参数列表类型组成;而C代码产生函数符号,仅由函数名组成。当链接时,会发生符号的重定义。

重载的注意点

  • 重载的前提是几个函数在同一作用域下。

    //下述情况下可以正确调用对应的函数
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    bool compare(int a, int b){
        cout << "int" << endl;
        return (a>b);
    }
    bool compare(double a, double b){
        cout << "double" << endl;
        return(a>b);
    }
    bool compare(const char * a, const char * b){
        cout << "double" << endl;
        return strcmp(a, b);
    }
    
    int main(){
        compare(1, 2);
        compare(1.0, 2.0);
        compare("aa", "vv");
        return 0;
    }
    
    //下述情况下无法正确调用对应的函数
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    bool compare(int a, int b){
        cout << "int" << endl;
        return (a>b);
    }
    bool compare(double a, double b){
        cout << "double" << endl;
        return(a>b);
    }
    bool compare(const char * a, const char * b){
        cout << "double" << endl;
        return strcmp(a, b);
    }
    
    int main(){
        bool compare(int, int)//当在局部声明了一个compare函数
        compare(1, 2); //后续的所有compare函数在局部作用域即找到了可调用的函数,则不会继续向全局作用域寻找其他conpare函数
        compare(1.0, 2.0); //会double强制类型转化int
        compare("aa", "vv"); //报错,无法强制类型转换
        return 0;
    }
    
  • const和volitale修饰形参,怎么影响形参类型的? 待补坑

  • 一组函数的函数名和参数相同,返回类型不同,则不算重载。

  • 什么是多态:编译期的静态多态:包含重载;运行期的动态多态。编译时期,指令就确定要重载哪个函数。

C++和C之间如何互相调用

  • 下述为C++主程序调用C函数

    //C规则下,只依据函数名生成符号表
    int sum(int a, int b){ //sum .text
        return a + b;
    }
    
    //C++规则下,依据函数名与形参生成符号表
    int sum(int a, int b); //sum_int_int "UND", 在链接时,无法匹配C中的符号sum
    int main(){
        int ret = sum(10, 20);
        cout << "ret" << ret << endl;
        return 0;
    }
    
    extern "C" //这里把C函数的声明加入extern C中
    {
        int sum(int a, int b); //按照C编译生成符号表 sum “UND”
    }
    int main(){
        int ret = sum(10, 20);
        cout << "ret" << ret << endl;
        return 0;
    }
    
  • 同样,如果C主程序调用C++

    extern "C" //cpp文件按照C编译
    {
        int sum(int a, int b){ //sum .text
            return a + b;
        }
    }
    
    int sum(int a, int b);  //sum “UND”
    
    int main(){
        int ret = sum(10, 20);
        cout << "ret" << ret << endl;
        return 0;
    }
    
  • 经常写作

    #ifdef __cplusplus //C++编译器内置的宏
    extern "C"{
    #endif
    //C++代码
    #ifdef __cplusplus
    }
    #endif
    
posted @   二氧化硅21  阅读(5)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示