栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++

编译器是负责啥的

c++只是一个文本可以理解为txt,编译器将文本转换为实际应用程序的方法

从文本变为二进制文件分为两步:编译、链接

如果学过java可以更好理解这个区别:在java中创建一个类,需要类名文件名一致,并且package路径要对;而c++不是,他只是一个文件,只需要告诉编译器这个文件是什么类型即可,是后缀cpp的或者txt的或者自定义的,然后告诉编译器这一类文件应该怎么处理就可以了

编译

将所有的文本文件转换为目标文件的一种中间格式(obj)

生成obj文件做的几件事:

1.预处理代码,所有预处理语句都会先处理

会识别#后的预处理语句,

#include 会把包含的文件内容复制到标记的位置(就是直接复制文本)

#define 会把文件中所有和define名字一样的进行文本替换

#if 和#endif 会根据if后的条件进行判断是否预编译这两个标记之间的代码、

做个实验:

EndBrace.h文件:是的,只有一个花括号

}

math.cpp文件

#if 1

#define INTEGER heihei

INTEGER Multiply(int a,int b) {
	INTEGER result = a * b;
	return result;
#include "EndBrace.h"

#endif

接下来要改一个配置:为了一会能看到预处理后的代码

上面的准备工作做完以后就可以切换到math.cpp文件然后进行编译(Ctrl+F7)然后会生成一个math.i的文件;也可以注意到如果对整个项目进行编译的话,每个cpp文件都会生成一个对应的 obj文件。

我们打开这个文件 

可以看到

1. #define INTEGER heihei 语句将所有INTEGER替换成了heihei(你想写啥都行,只是测试预编译用)

2.然后#include "EndBrace.h"把文件中的花括号复制了进来

3.如果#if后面是0 ,那么这段代码就不会被预编译了

 上面预编译就结束了,记得把配置改回去,因为预处理到文件如果是yes,那么就不会生成obj文件

还有定义的全局变量改成能识别的 int,总之上面测试的代码只能通过预编译,因为heihei这个东西所以无法运行,可以改成int。

有没有发现main.obj很大几十kb,那是因为把iostream复制进去了

编译阶段 

首先还需要改下配置,因为obj是机器码,看不懂,我们需要看编译后的文件,所以改成下面配置,虽然我还是看不懂但至少有英文单词了

接下来一样滴Ctrl+F7 然后打开math.asm 文件,这个就是汇编语言啦,不研究了~电脑可以执行了

这个配置是一个优化配置两张图都要配置好不然会报错,选择最大速度,在次编译后你会发现文件内容会少很多,比如写了没用的代码也会被优化掉

 不晓得为啥,日后更新

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950167.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号