提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、计算机的工作方式简介
CPU——执行指令
内存——指令仓库
我们程序员做的事情就是写一些指令,通过地址线和数据线让CPU执行内存中的指令
二、人类语言的翻译官——编译器
1.编译器的诞生
2.C语言编译器
C语言的编译器分为两大阵营:
微软阵营:MSVC
开源组织阵营GNU:gcc
Linux系统上:gcc
Windows系统上:minGW
3.编译器工作流程
1.预处理阶段
第一个阶段为预处理阶段
编译器会识别#开头的代码,对其进行预处理
#include<stdio.h>
#define ABC 10
int main() {
int a = ABC;
```c
#ifdef DEBUG
printf("hello,world!\n");
#else
printf("--------");
#endif // !DEBUG
return 0;
}
上述代码中的语句int a = ABC;经过预处理后会变成int a = 10;
打开a.i文件:ABC已经被替换为10
#ifdef DEBUG
printf("hello,world!\n");
#else
printf("--------");
#endif // !DEBUG
这部分代码属于条件编译的内容
执行一个printf(“hello,world!\n”);要耗费CPU的资源和时间,在开发中一般是用于让程序员看到程序运行到了这一步,而在实际产品中这一步毫无意义,这时候就可以用条件编译。
对于上述代码段,正常执行运行结果如下图,输出了else下面的部分
而要想输出hello,world,只需要 -D就可以,如下图所示:
关于条件编译还有如下应用场景:
如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。如:
我们有一个数据类型,在windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这
样往往需要对源程序作必要的修改,这就降低了程序的通用性,可以用一下的条件编译:
#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#define
如果在windows上编译程序,则可以在程序的开始加上
#define WINDOWS
这样则编译下面的命令行:
#define MYTYPE long
否则编译:
#define MYTYPE float
2编译—汇编—链接
人能看懂的代码 ------编译------ 汇编语言
汇编语言 ------汇编------机器指令集
机器指令集------链接 确定数据的地址 ------ 可执行文件
a.c—预处理—>a.i—编译—>a.s—汇编—>a.o—链接—>build.exe