写c++的基本流程:
是你有一些c++的源文件,然后将这些源文件给到编译器,编译器将其转变成二进制的东西,二进制可能是某种库,或者是可执行的程序。
可执行程序
#include <iostream>
在#符号之后的都是预处理语句,编译器收到源文件后,一看到这条语句,就先处理这个预处理语句。
在编译之前就被处理了
include——指在这个例子中,需要找到iostream的文件,然后该文件所有内容拷贝到现在的文件内,这些文件通常被称为“头文件”
<iostream>——头文件是因为我们需要一个被调用的函数的声明
std::cout << "Hello World" << std::endl;
std::cout——可以让我们在终端打印东西
<< ——只是写成这样,并没有更多的实际含义,可以理解成为一个函数,相当于↓
std::cout.print("Hello World").print(std::endl);
另一层的含义是,将字符串Hello World推送到cout流中,然后打印到终端,然后推送一个行结束符;
endl——告诉终端跳到下一行
std::cin.get();
cin.get——等待按下enter键,在前往下一句代码之前等待,这时候程序暂停执行,直到我们按下回车键后,程序继续运行下一行,
但已经没有下一行了,所以程序返回0,意味着代码执行完了。
int main()
main——任何一个c++程序都有main函数,是程序的入口
main函数比较特殊,它不一定要返回值,如果不返回值.,默认返回了0
如何转换成可运行的二进制文件?
#include <iostream> 先处理预处理语句 ,就可以使用cout.、cin.get函数了
编译:将所有的c++代码转换为实际的机器代码
重要的设置决定我们怎么转换代码:
解决方案配置
X86的意思是目标平台是windows 32位,也就是说会生成32位的windows应用程序
右击点击项目属性(最下面)
这里
是比较重要的,如果我们想做一个生成库文件的项目
项目中的每一个cpp文件都会被编译,但头文件不会被编译,
每一个cpp文件都被编译成了一个object file(目标文件)(如果用vs,生成的文件后缀是.obj)
把这些obj文件合并成一个执行文件
单独编译快捷键:ctrl+f7
编译成功
链接(LINK):基本上,链接就是将所有的obj文件,粘合到一起,把这些obj文件合并成一个执行文件exe
多个c++文件呢?
用自己的logging函数来包裹coun函数,因此我们建立一个函数,参数是message,打印这个message.到终端
const char*——是一个包含字符串的类型
点击
看是否可以运行
新建Log.cpp
声明——这个符号、函数是存在的;
定义——这个函数到底是什么
新建EndBrace.h头文件
编译成功
因为编译器做的是打开这个文件复制的所有内容
确保正在编辑的是当前的配置,以及要应用这些配置的平台 yes后就不能产生obj文件了
.i文件
修改
obj文件内容(二进制)
.asm 汇编语言
没有main函数会出现链接错误
C开头代表编译错误(缺少分号)
一种类型的链接错误:
未解决的外部符号 unresolvef external symbol :当链接器找不到它需要的东西时发生。
(比如函数Log错写成Logr)
static int Muitiply(int a, int b)
static——意味着这个Muitiply函数只被声明在这个翻译单元中,也就是这里的Math.cpp文件中,
若Muitiply在这个Math.cp从不被调用,如果build,不会得到任何错误;
声明和定义必须完全一致
返回值是void,就不能返回int
另一种链接错误:
有重复的符号,换句话说,有函数或变量有相同的名字和相同的签名,两个名字相同的返回值和相同的参数。
解决方法一:
static void Log(const char* message)
将Log函数标记为静态的,这意味着在链接Log函数时,Log函数只能是内部函数,每个cpp文件都会有自己的版本的Log函数
解决方法二:
inline void Log(const char* message)
inline——获取我们实际的函数体并将函数调用替换为函数体