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文件
用文本编辑器打开:
我们看到这个乘法函数调用了一堆汇编命令。
一段程序到机器语言是这样的路径:
高级语言-->汇编语言-->机器语言。