内联函数、外部函数和静态函数

C++声明或定义的函数可分为4种作用域:

  1. 默认全局函数
  2. 内联函数 ,即inline函数
  3. 外部函数 ,即extern函数
  4. 静态函数,即static函数

内联函数:
inline函数
是一种在文件作用域内用inline说明或定义的局部函数
是一种直接将其函数体代码插入到主调函数调用位置,以代替函数调用,提高执行效率的函数

在进行函数调用时,除了完成函数体对应的计算指令外,还需要完成传递实参、保存寄存器和恢复寄存器等操作,这些操作都是计算指令之外的操作或开销,而真正用于函数体计算的指令很少,此时通过内联函数,由编译器将函数调用指令替换为函数体计算指令,既可以降低调用开销,又可以提高执行效率。

//计算圆的面积和周长
inline double PI = 3.1416;
inline double perimeter(double r);//内联函数声明
inline double area(double r)//加上inline,相当于在函数前加上了static,所以该函数只能在当前代码文件调用 
{
	//注意:不能在内部定义inline变量
	return PI*r*r;
}
void main()
{
	double a;
	double p;
	p = perimeter(10.0);//内联失败,函数的定义出现在调用之后了
	a = area(10.0);//内联成功,编译为m = 3.1416*10.0*10.0
}
double perimeter(double r)//内联函数定义
{
	return 2*PI*r;
}

注:
内联函数内部不能使用分支、循环、多分支和函数调用等引起转移的语句,否则还是被编译为调用指令

外部函数:
使用关键字extern修饰的函数,
声明函数时,不能直接定义函数体。

C语言函数作用域分:
1)全局函数,即任何代码文件都可访问或调用的函数
2)静态函数
外部函数要么来自全局函数,要么来自静态函数

利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数

在同一个文件中:

int sum(m,n);
void main()
{
	cout << num;//这样写的话,编译器是找不到num的,会报错
	sum(2,num);//在sum函数里面是可以使用的,因为num的声明在调用之前
}
int num;
int sum(m,n)
{
	return m + n;
}

这个时候我们可以这样写:

int sum(m,n);
void main()
{
	extern int num;//此时可以使用在后面定义的变量
	cout << num;
	sum(2,num);
}
int num=3;
int sum(m,n)
{
	return m + n;
}

在两个文件中:
a.cpp

int num = 10;
int sum()
{
	return num+num;
}

main.cpp

void main()
{
	extern int num;//若不想变量被修改,加上const,变为extern const int num;
	extern int sum();//此时就可以调用到a.cpp里面的变量和函数
	num = 5;//修改变量的值
	cout << num;
	cout << sum();
	
}

静态函数:
用static修饰的函数,其作用域仅限于当前代码文件,仅能够被当前代码文件内的函数访问或调用。

代码文件:.cpp
目标文件:.obj
静态链接库文件:.lib
动态链接库文件:.dll

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

只有帅跟我匹配

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值