C++:函数的重载、inline函数、C/C++相互调用

一、重载(overloading) :函数名字相同,而参数不同。返回类型可以相同也可以不同。     

若有题目为:实现两个数相加,一般我们都会想到如下代码:

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

但事实我们考虑并不全面,因为并没有给出要求是实现两个整型数相加,我们还需要考虑double、float等等其他类型,需要全面考虑,但之前在c语言中不允许实现如下代码 :

int Sum(int a,int b)//?Sum@@YAHHH@Z
{
    return a+b;
}
doubel Sum(doubel a,double b)//?Sum@@YANNN@Z
{
    return a+b;
}

但在c++中我们可以实现,原因是因为C语言和C++的符号生成规则不同

符号生成规则:?函数名称@@Y调用约定 返回值类型 形参类型 形参类型@Z

                函数返回值

                函数名称

                形参列表:形参类型、个数、顺序

int Add(int, int);		// ?Add@@YAHHH@Z
double Add(int, int);		// ?Add@@YANHH@Z
double Add1(int, int);	        // ?Add1@@YANHH@Z
double Add1(double, double);    // ?Add1@@YANNN@Z
double Add1(double, double, double);// ?Add1@@YANNNN@Z
double Add1(double,int);	//?Add1@@YANNH@Z
double Add1(int, double);	//?Add1@@YANHN@Z

重载特点:

              1.不能使编译器产生二义性

               2.不依赖返回值

               3.三要素:同作用域、同名、参数不同

二、inline内联函数:编译阶段,在调用点直接将代码展开

inline int Sum(int a, int b)//_Sum_int_int .text  本文件
{
	return a + b;
}

1.内联函数和static修饰的函数的区别:

共同点:都是本文件可见;

不同点:内联函数没有栈帧的开辟和清理的开销;

               static修饰的函数开栈和清栈的开销;

2.优点:提高效率;

3.缺点:以代码膨胀为代价,空间浪费大;

建议适用内联的情况:函数代码的执行开销小于函数代码的开栈、清栈开销

4.注意事项:

            1.写在头文件;

            2.只在release版本生效,debug版本不生效,依旧有开栈清栈过程;

            3.并不是所有函数都能写成内联,例如:递归、while、switch不可以;

            4.基于实现,不是基于声明的,若加在声明中是无效的。

三、C/C++的相互调用

1.C++调用C方法:用 extern "C" (其包含的代码以C语言处理)声明包含

extern "C"
{
    extern int Sum(int, int); 
}

 

2.C调用C++方法:用 extern "C" (其包含的代码以C语言处理)将代码包含,分两种情况

         ①:C++能修改:在.cpp文件中添加extern声明

extern "C"
{
     int Sum(int a, int b)
     {
          return a+b;
     }
}

         ②:C++不能修改:添加中间层文件

//新建一个.cpp
extern int Sum(int, int);
extern "C"
{
	int MySum(int a, int b)
	{
		return Sum(a, b);
	}
}

判断C++是否能修改:

#ifdef __cplusplus//如果宏定义,C++会编译好,C未定义

extern "C"
{
#endif
    int Sum(int a, int b)
    {
	return a + b;
    }
#ifdef __cplusplus
}
#endif

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值