one definition rule
内部链接属性
使用const和static,可以在两个转换单元中重复定义相同的变量和函数,使得函数和变量拥有内部链接属性
外部链接属性
使用extern可以导入外部的函数和变量,使其拥有外部链接属性
如果文件b.c需要引用a.c中变量int v,就可以在b.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。注意,extern int v可以放在a.c中的任何地方,具体作用范围和局部变量相同。
extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
【014 关键字】一文彻底搞懂extern用法-CSDN博客
宏函数和内联函数---外部链接属性
出现动机:
减少函数栈帧的开辟和销毁,如当频繁调用一个函数的时候(比如快排算法中函数多次被调用),此时消耗栈帧的比较大(不断地调用栈帧销毁栈帧)。
因此要将函数栈帧的优化掉
C语言的解决方案:宏函数
对于C语言中,可以使用宏函数。
使用宏函数为什么没有函数栈帧的消耗???
因为在预处理阶段就被替换了----优化了,没有了函数的栈帧的消耗了
新方案:C++方案—内联函数
因为宏函数有很多不方便的地方:
- 不可以调试
- 没有类型安全检查
- 容易写错
比如你可以写一个ADD宏函数来验证:
【C++】内联函数----inline函数的详细使用教程-CSDN博客
namespace
创建命名空间
namespace t{
int value;
}
但是使用namespace后,会将其中全部的结构都导入进来,使得效率比较低下,且优点有限,只能使我们少些点字
全局命名空间
局部覆盖全局时,可以用::访问全局
(比如局部变量就没有链接属性)
命名空间扩展
未命名的命名空间
命名空间的别名
预处理逻辑
和if用法很像
ifdef 和 ifndef
用来预处理,比如控制版本等等
#if
#elif
预定义宏
标准宏