c++的头文件的一些问题

头文件的写法

source2.h
-------------------------------------
#ifndef
#define SOURCE_2_H_
extern int a;   
#endif

-------------------------------------

source2.cpp
-------------------------------------
#include"source2.h"
...
int a=5;
-------------------------------------

#ifndef的作用

程序运行的时候,include的头文件的所有内容会被替换到目标文件下,替换完毕之后,一个完整的cpp是一个单独的编译单元,此时有可能出现一个头文件被多次引入的情况,比如说在main.cpp中引入了头文件A,而main.cpp下引入的头文件B中又引入了头文件A,此时的完整替换完的main.cpp文件就会有多段重复的代码,这是采用宏就可以不对编译过的代码再次编译。
但要注意的是,#ifndef可以对重复的代码不进行二次编译,所以main.cpp单元内就不会出现重复定义这个问题,但是到了链接阶段,多个cpp可能同时引入了头文件A,所以把变量的定义或者函数的定义放在头文件中会导致链接阶段重复定义的问题,考虑到这点之后,c++推出了关键字extern用在声明变量是外部链接的,也叫引用声明,表示当前变量的定义只是一个声明而不是一个定义,具体的定义需要在链接的过程中找到对应文件下的定义。如上述source2头文件的例子,extern int a表明这只是一个变量的声明,并不是在此处定义的,在链接阶段会从对应的.cpp编译的二进制文件中找到变量定义。所以在头文件中一般只写声明。
extern这个关键字本身有很多细节,使用该关键字时如果初始化的话,就会创建变量而不是一个引用声明,全局变量不是static的话,默认是extern,可以省略等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值