OK! Right now! Let's go!
如何从源文件开始,实际的文本文档到可执行的二进制代码,写C++程序的基本流程。
实际是你有一些C++的源文件,然后将这些源文件给到编译器,编译器将其转成二进制的东西,二进制的东西可能是某种库,或者是可执行的程序。
在#符号之后的都是预处理语句,编译器收到源文件后,一看到这条语句,就先处理这些预处理语句(在实际编译发生之前就被处理了)
include的含义:他需要找到一个文件,在这个例子中,他需要找到iostream,然后将该文件所有内容,拷贝到现在的文件,这些所包含的文件被称为头文件。我们之所以要包含iostream这个头文件,是因为我们需要一个被调用的函数的声明。std::cout 可以让我们在终端打印东西。
main函数:任何一个C++程序都有一个main函数,他是程序的入口,意思是当我们运行程序时,计算机就从这个函数开始执行代码,当程序还在运行时,计算机会逐行执行我们的代码。当然,程序也可以中断或者改变执行的顺序,他们是控制语句或者函数调用。但最主要的还是一行一行的执行。因此,我们程序首选被执行的是
std::cout这句,然后是std::cin。运行完main中所有的东西后。我们的程序结束了。虽然她的返回值是int类型,但我们省略没写,是因为它默认返回0,这个只对main函数适用。
<< 叫做重载运算符 ,可以把他理解为一个函数,另一层含义是将字符串hello world推送的cout流中,然后打印到终端,然后推送一个行结束符endl,告诉终端调到下一行cin.get()函数是等待我们按下enter键,在前往下一句代码之前等待,这个时候程序暂时执行,直到我们按下回车键之后,程序继续运行下一行,但没有了,所以程序返回0,意味着代码执行结束 。
好了,我们现在写完了源代码文件main.cpp,我们怎么把它转换成可运行的二进制文件?
这有几个步骤,首先我们已经include <iostream>,这是预处理语句,编译器先处理这些语句 ,在这个例子中,编译器会将iostream文件内容全部包含进来,拷贝粘贴内容到代码文件中。
当预处理语句处理完了之后,我们的文件将被编译,这个阶段,编译器
将所有C++代码转化为实际机器代码,这里有些非常重要的设置决定我们怎么转化代码。
配置只是构建项目时候的一系列规则而已。
解决方案平台是指你编译的代码的目标平台,x86的意思就是目标平台是windows 32位,也就是说会生成32位的windows应用程序
debug模式会比release模式更慢,是因为优化都被关掉了,但是关掉的好处是我们可以调试代码
项目中的每个文件都会被 编译,但头文件不会被编译,仅仅是cpp文件中的头文件,原因是头文件的内容在预处理时已经包含进来了。
将要被编译的cpp文件,分别被编译器编译,每一个cpp文件都被编译成了一个object file(目标文件),如果我们用vs,生成的文件后缀是.obj,当我们有了这些生成的独立的obj文件后,我们需要把这些文件合并成一个执行文件。
轮到我们的朋友链接(link)出场了,基本上,链接的作用就是将所有的obj文件粘合在一起,将所有的obj文件合并成一个exe文件
当我们独立编译之后,链接还没发生,很明显我们编译单独一个文件,不会进行链接,编译器编译后都生成了.obj的目标文件,对于项目中的每一个C++文件,都会生成一个obj文件
这次我们构建整个项目,我们会看到生成了.exe文件,我们可以双击并打开它。
但如果是多个C++文件呢?假设我们仍然要打印Hello World,但我不想要用cout函数,我想用我自己的函数logging函数来包裹cout函数,因此我们建立一个函数,参数是message
我们将函数移动到另一个地方,然后我们对每个文件进行单独的编译,main.cpp文件并不知道还有个叫log的函数,因为不认识他,所以报错,我们可以通过调用声明来修复此错误,声明就像我们宣布有个东西叫log的函数是存在的,这就像是告诉编译器,这里有一个名叫log的函数,编译器只需要相信我们就好了,因为编译器并不关心这个函数是在哪定义的。
声明和定义:声明就是说这个符号、函数是存在的。 定义的意思是说这个函数到底是什么。
你或许会疑惑编译器是怎么知道log函数在另一个文件中,答案就是编译器知道,他相信我们
他怎么实际运行到正确的代码?这里就需要链接了 ,当我们构建整个工程时,不是单个文件,如果我们右键点击生成(build),我们所有的文件都会被编译。链接器会找到正确的log函数定义在哪里,将函数定义导入log函数声明中,让我们在main.cpp文件中调用。如果我们找不到log函数的定义,将会出现链接错误。
标签:文件,函数,C++,我们,编译,编译器,链接,log From: https://blog.csdn.net/2401_87088772/article/details/142254019