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

xiaoxiao2021-02-27  222

头文件的写法

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,可以省略等。

转载请注明原文地址: https://www.6miu.com/read-15507.html

最新回复(0)