C++和C

C++和C区别

1.函数重载

C++产生函数符号的时候是由函数名+参数列表组成的
C产生函数符号的时候是由函数名决定的。因此,C语言不支持函数重载

1. 什么是函数重载

  1. 一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称为函数重载

  2. 一组函数要称得上重载,一定要在同一个作用域中。

    • 同一作用域:

      #include <iostream>
      #include <cstring>
      using namespace std;
      
      bool compare(int a, int b) {
          cout << "int int" << endl;
          return a > b;
      }
      
      bool compare(double a, double b) {
          cout << "double double" << endl;
          return a > b;
      }
      
      bool compare(const char* a, const char* b) {
          cout << "const char*   const char*" << endl;
          return a > b;
      }
      
      int main() {
          //bool compare(int, int);
          compare(10, 20);
          compare(10.2, 40.2);
          compare("abcd", "efgh");
      
          return 0;
      }
      
    • 不同作用域

      #include <iostream>
      #include <cstring>
      using namespace std;
      
      bool compare(int a, int b) {
          cout << "int int" << endl;
          return a > b;
      }
      
      bool compare(double a, double b) {
          cout << "double double" << endl;
          return a > b;
      }
      
      bool compare(const char* a, const char* b) {
          cout << "const char*   const char*" << endl;
          return a > b;
      }
      
      int main(){
          bool compare(int, int);
          compare(10, 20);//int int
          compare(10.2, 40.2);//int int
          compare("abcd", "efgh");//error
      
          return 0;
      }
      

      由于在main()函数内部作用域中仅仅声明了 bool compare(int, int);,因此,compare("abcd", "efgh");会去调用该作用域声明的函数,也就会试图把const char* 转换成int

      显示结果:

      在这里插入图片描述

  3. const或者volatile的时候

    • const情况下:

      void func(int a) {
          cout << "int" << endl;
      }
      
      void func(const int a) {
          cout << "const int" << endl;
      }
      int main() {
          int a = 10;
          func(a);
          const int b = 99;
          func(b);
          return 0;
      }
      

      显示结果:
      在这里插入图片描述

    编译器认为void func(int a)void func(const int a)是一样的.

  4. 一组函数,函数名相同,参数列表也相同,仅仅返回值不同,不叫重载。

2. C++、C如何相互调用?

1. C++调用C

如果直接调用,由于C++中函数符号表为:函数名+参数列表;而C中函数只是函数名。

因此C++无法找到C函数。

方法:采用extern实现,把C函数的声明括在extern "C"里面

//test01.c(注意是C文件)
int sum(int a, int b) {
 return a+b;
}
//main.cpp
#include <iostream>
#include <cstring>
using namespace std;

extern "C" {
    int sum(int a, int b);
}

int main() {
    int ret = sum(10, 20);
    cout << "ret : " << ret << endl;
    return 0;
}

2.C调用C++

方法:也是采用extern,但是extern是CPP才有的,C没这个语法

因此我们仍然要在.cpp文件中使用。

把C++源码括在extern “C”里面

//test01.c

#include<stdio.h>
int main() {
    int ret = sum(10, 20);
    printf("ret : %d\n", ret);
    return 0;
}
//main.cpp

#include<iostream>
extern "C" {
    int sum(int a, int b) {
        return a + b;
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值