c++如何工作


源文件就是文本文件转化到可执行的二进制文件或者程序,然后源文件会传到编译器,然后编译成二进制文件(binary)

 #include<iostream>

int main()
{
	std::cout << "hello world " << std::endl;
	std::cin.get();
}

include

首先这其中· #include称为预处理文件,任何以#开始都是预处理文件,当编译器收到一个源文件时,它第一件事就是预处理你所有的预处理指令。这就是为啥·叫预处理,因为整的发生在编译之前。
这里用include,include就是找到一个文件,这里是找一个叫iostream,该文件里所有内容会被复制到目前这个文件里。
你include的文件被称为头文件,我们之所有include头文件iostream是因为我们需要一个函数(function):cout的申明。cout可以打印东西到控制台console,然后我们有了这个main函数,main函数相当重要。

main

main函数被称作入口点(entry point)也就是说我们运行程序时,计算机会从该函数里的代码开始执行。
这其中main的定义是int,然而我们没有返回一个整数(integer)。
这是因为main是个例外,你不需要从主函数返回任何类型的值,如果你不返回任何值,它会返回0,这只适合于main函数

<<

在这里插入图片描述
这些向左的带角的括号,看起来像左移位符号(bit shift),其实是被重载的符号,你得把它想成一个函数,我知道他看起来像运算符,但实际上,运算符就是函数,所以这种情况下和cout.print一模一样
这里目的即使把hello world 传入 cout,cout把它打印在控制台里。然后传入endl,end line告诉控制台前进到另一行。

linker链接器

1首先 include iostream,即使预处理,会在编译文件之前被评估。即使把iostream中内容拷贝到这个文件里。
2当我们头文件被评估后,我们的文件会被编译,这个阶段,编译器会把我们的c++转化成实际的机器码。
所有cpp文件都会被编译,而头文件不会,只有cpp,头文件在预处理被include到头文件里,那是他们被编译的时候,所以我们有一堆cpp文件被编译,而且它们是一个个被单独被编译的。每个cpp文件会被编译成一个object文件,如果扩展名的话,用Windows编译器是.obj,当有了一个个obj时候,也就是cpp被编译过后的结果,我们得有办法把他们联系起来,组成exe。这时我们得朋友linker(链接器)就有用武之地
你可以在linker标签下看它的设定,但基本就是把所有obj拿来的然后联系起来
linker的作用是把所有obj连成exe,
error list 的工作原理是,解析(parse)output窗口,找error关键字,然后从哪找信息,放入list,功能简单,output功能比较全面
在这里插入图片描述
此处双击问题即可到发生错误的地方。
当你单独编译一个文件,linking显然不会发生,因为你单独一个文件。
如果我们有多个c++文件呢?
假设我们有打印hello world 到控制台,但不想用cout,用自己的logging函数,这就需要包装logging函数

我们来写log函数,会接受cstring作为参数,取名,message,并打印message到控制台。
在这里插入图片描述
此时我们可以把log放到另一个文件
在这里插入图片描述
新建一个log.cpp会发现cout不是std的member,这基本上说不懂cout是啥,这要是没有吧cout声明include进来。
c++中每个symbol都需要某种声明,cout是main里include文件里定义的一个函数,也就是iostream
把#include剪切入log.cpp再次编译成功了
回到main我想调用log函数,ctrl+f7编译失败,不知道cin,加入#include,会发现log还是找不到,我们把函数从一个文件移动到另一个。
发生错误的原因是它识别不出log,所以我们需要通过一个声明(declaration)来解决。声明从字面意思,就是声明log是一个存在的东西。有点像承诺,告诉编译器有一个函数叫log,编译器就真的相信了。因为编译器根本不关心resolving(解析)log到底被哪定义的。
这里有两个词,declaration(声明)和definition(定义)申明就是这个symbol真的存在,定义是说这个函数到底是什么,这个函数的主体。

这中间有个疑问,如何能确定有这个函数,这时候link就有用了。
当我们文件被编译后,linker就会去找log的定义,然后跟我们main里调用联系起来。
如果找不到定义,就会得到linker error
在这里插入图片描述
我们可以看到两个obj因为,每个编译cpp都会产生obj,然后linker会串成exe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值