1 C语言的开发流程
1 编写源码
使用的IDE:
1 如何用VS写源码
2 用记事本写源码
2 编译源码
对源码进行编译:
编译器gcc
配置环境变量 path添加gcc.exe的路径
完成后gcc -v 查看是否成功配置
tips:Windows窗口清屏命令:cls
编译源代码指令:
gcc hello.c -o生成的目标可执行文件 xxx.exe
3 执行可执行文件xxx.exe
windows窗口执行xxx
2 C语言的编译步骤
前言:上面处理是一步到位:源文件生成可执行文件
编译实际是经过四步的:
举个例子:
test.c
#include <stdio.h>
#include "mymath.h"
int main()
{
int a = 1;
int b = 2;
int c = add(a, b);
printf("%d\n", c);
return 0;
}
mymath.h
#ifndef MYMATH_H
#define MYMATH_H
int add(int a, int b);
#endif
mymath.c
#include "mymath.h"
int add(int a, int b)
{
return a+b;
}
2.1 预处理
预处理用于将所有的#include
头文件以及宏定义#define
替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。
gcc -E test.c -o test.i 生成预处理文件
上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程
1 预编译会处理带#的指令如#include <stdio.h>
头文件展开:预处理时将stdio.h文件拷贝至预处理文件中
2 删除注释
3 宏替换:#define 定义一个宏 如#define PI 3.14,将文件中的所有用宏的地方用表达式替换
4 预处理不会检查语法错误
5 条件编译处理:根据编译键入条件选择代码进行编译
如:gcc -E test.c -o test.i -Dabc
此时代码段中
#if abc
printf("hello world")
#endif
的代码就会放入到预处理文件中,
如果键入gcc -E test.c -o test.i,预处理文件中就不会有该代码段
2.2 编译
这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。
gcc -S test.i -o test.s
将预处理文件编译生成汇编文件
检查语法错误
2.3 汇编
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。
gcc -c test.s -o test.o
将汇编文件编译生成二进制文件.o
tips:此时二进制文件执行不了,需要设置链接一些环境等
二进制文件,记事本打开无法解码查看,所以为乱码
2.4 链接
链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。默认是动态链接,可通过-static指定为静态链接
gcc mymath.o test.o -o answer
2.5 总结
( test.c mymath.c ) --1–> (test.i mymath.i) --2–> (test.s mymath.s) --3–> (test.o mymath.o) --4–> (answer.exe)
- 预处理,展开头文件/宏替换/全掉注释/条件编译
- 编译,检查语法,生成汇编
- 汇编,汇编代码转换成机器码
- 链接,链接到一起生成可执行文件
3 第一个C程序hello.c详解
//# 预处理指令,在预编译时处理
//#include <stdio.h> 包含stdio.h文件 stdio.h类似于菜单
//printf函数依赖于stdio.h文件里的函数声明
// 两个斜杠是注释
//符号与()结和代表这个是一个函数
//main() main函数也叫主函数 整个程序中仅且只有一个main函数,程序从main函数
//开始执行
//int 代表main函数结束之后的返回值类型
//return 结束这个函数,然后返回值,返回值的类型和函数定义时返回值类型一致
//int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
//{}里面的是函数体,所有需要执行的代码必须写在{}中
//每一条代码必须以分号;结尾
//printf是一个库函数,printf+()就是函数调用
#include <stdio.h>
int main()
{
printf("hello world\n");//打印到终端
return 0;
}
4 system库函数
作用: 在程序中启动另一个程序
参数:要的是待启动程序的路径名
#include <stdio.h>
#include <stdlib.h>
int main()
{
//syetem启动程序,如果这个程序系统可以找到,不用加路径,
//如果环境变量找不到,需要加路径
//windows路径以\\ 或 /
//system("mspaint");//启动画图板
//system("C:\\Users\\Administrator\\Desktop\\c++13\\hello.exe");
system("C:/Users/Administrator/Desktop/c++13/hello.exe");
printf("hello worldfbahfoahfoooooooooooooooooooooo\n");//打印到终端
return 0;
}
5 CPU概述
cpu运算,寄存器存储运算的数据
CPU计算时,预先将需要的数据从硬盘读到内存,再把数据从内存读到寄存器
因此CPU、寄存器、内存之间存在数据交换
缓存:来提高内存与寄存器之间的交换速度,经常操作内存同一地址的数据,通过缓存提高运行速度