include 门路查找
头文件是一种文本文件,应用文本编辑器将代码编写好之后,以扩展名.h 保留。头文件中个别放一些重复使用的代码,例如函数申明、变量申明、常数定义、宏的定义等等。当应用#include 语句将头文件援用时,相当于将头文件中所有内容,复制到#include 处。#include 有两种写法模式,别离是:
#include <>
:间接到零碎指定的某些目录中去找某些头文件。
#include ""
:先到源文件所在文件夹去找,而后再到零碎指定的某些目录中去找某些头文件。
编译单元(模块)
点击编译按钮生成可执行文件时,编译器做了两步工作:
- 将每个.cpp(.c) 和相应的.h 文件编译成 obj 文件;
- 将工程中所有的 obj 文件进行 LINK,生成最终.exe 文件。
那么,谬误可能在两个中央产生:
- 编译时的谬误,这个次要是语法错误;
- 链接时的谬误,次要是反复定义变量等。
编译单元指在编译阶段生成的每个 obj 文件。
一个 obj 文件就是一个编译单元。
一个.cpp(.c) 和它相应的.h 文件独特组成了一个编译单元。
一个工程由很多编译单元组成,每个 obj 文件里蕴含了变量存储的绝对地址等。
申明与定义
函数或变量在申明时,并没有给它理论的物理内存空间,它有时候可保障你的程序编译通过;
函数或变量在定义时,它就在内存中有了理论的物理空间。
如果你在编译单元中援用的内部变量没有在整个工程中任何一个中央定义的话,那么即便它在编译时能够通过,在连贯时也会报错,因为程序在内存中找不到这个变量。
函数或变量能够申明屡次,但定义只能有一次。
动态全局变量 (static)
留神应用 static 润饰变量,就不能应用 extern 来润饰,即 static 和 extern 不可同时呈现。
static 润饰的全局变量的申明与定义同时进行,即当你在头文件中应用 static 申明了全局变量,同时它也被定义了。
static 润饰的全局变量的作用域只能是自身的编译单元。在其余编译单元应用它时,只是简略的把其值复制给了其余编译单元,其余编译单元会另外开个内存保留它,在其余编译单元对它的批改并不影响自身在定义时的值。即在其余编译单元 A 应用它时,它所在的物理地址,和其余编译单元 B 应用它时,它所在的物理地址不一样,A 和 B 对它所做的批改都不能传递给对方。
多个中央援用动态全局变量所在的头文件,不会呈现重定义谬误,因为在每个编译单元都对它开拓了额定的空间进行存储。
全局常量 (const)
const 独自应用时,其个性与 static 一样(每个编译单元中地址都不一样,不过因为是常量,也不能批改,所以就没有多大关系)。
const 与 extern 一起应用时,其个性与 extern 一样。
参考链接:
https://blog.csdn.net/candyli…