C++_CH02_编译器工作

C++_CH02_编译器工作

2.1预处理

2.1.1 include

我们在vs2022中新建一个project,之后,在源文件栏新建一个文件,我们命名为multiply,在头文件中新建一个文件,我们命名为symbol。

multiply:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

int multiply(int a, int b)
{
	int result = a * b;
	return result;

我们可以发现一个细节,我们的末尾缺少一个花括号。
这样的编译当然是会报错的。

那么我们再来关注一个symbol里放的是什么呢?

#pragma once
}

这个头文件就长这样,没错,就是这样。

此时我们修改multiply代码,能够看到此时编译是能够完成的:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

int multiply(int a, int b)
{
	int result = a * b;
	return result;
	include "symbol.h"

在这里插入图片描述
我们右击项目,打开C/C++栏–>找到预处理–>将预处理到文件勾选为‘是’。之后ctrl+f7编译。在输出目录找到multiply.i文件:
在这里插入图片描述
该文件是我们经过预处理后的代码。
在这里插入图片描述

2.1.2define

我们用定义宏的方式(也是一种预处理),将int定义为INTAGER

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#define INTEGER int

INTEGER multiply(INTEGER a, INTEGER b)
{
	INTEGER result = a * b;
	return result;
#include "symbol.h"

我们再按ctrl + f7
编译之后查看multiply.i文件:
在这里插入图片描述
可以发现没有变化。这证明预处理是提前被编译的。我们把define
INTEGER int换成define INTEGER star,再编译(不用管报错)查看:
在这里插入图片描述
会发现预处理之后的文件里int全变成了star。

2.1.3 #if预处理语句

#if的作用是在给定条件成立的情况下的if里的代码才会被执行

#if 1 //让条件为1(恒成立)
int multiply(int a, int b)
{
	result = a*b;
	return result;
}
#endif

ctrl + f7,查看multiply.i:
在这里插入图片描述

把1改成0,再次编译:
在这里插入图片描述
此时什么都没有。

2.2查看obj文件

再次右击project,打开C/C++栏,点击预处理器,把刚刚的是改成否,否则我们无法得到obj文件。
打开obj文件,会看到这个样的二进制文本
在这里插入图片描述
有几个方法可以解决:
点开属性,找到输出文件,把输出文件改成仅有程序集的列表。
之后再次编译,会看到一个multiply.asm文件
在这里插入图片描述

用文本编辑器打开:
在这里插入图片描述
我们看到这个乘法函数调用了一堆汇编命令。

一段程序到机器语言是这样的路径:

高级语言-->汇编语言-->机器语言。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值