C++声明或定义的函数可分为4种作用域:
- 默认全局函数
- 内联函数 ,即inline函数
- 外部函数 ,即extern函数
- 静态函数,即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