编译器-c++

 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/c++宏函数和多参宏函数_c++ 宏函数-CSDN博客

新方案:C++方案—内联函数 

因为宏函数有很多不方便的地方:

  1. 不可以调试
  2. 没有类型安全检查
  3. 容易写错
    比如你可以写一个ADD宏函数来验证:

【C++】内联函数----inline函数的详细使用教程-CSDN博客 

 

namespace

 创建命名空间

namespace t{
    int value;
}

但是使用namespace后,会将其中全部的结构都导入进来,使得效率比较低下,且优点有限,只能使我们少些点字 

全局命名空间

局部覆盖全局时,可以用::访问全局 

(比如局部变量就没有链接属性) 

 命名空间扩展

 

未命名的命名空间 

命名空间的别名 

 预处理逻辑

和if用法很像

ifdef 和 ifndef

用来预处理,比如控制版本等等

 

#if 

 

#elif 

预定义宏

标准宏

 

编译器(msvc)自定义的宏

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值