目录
- 前言
- 1 课程介绍
- 1.1 计算机程序语言的学习思路?
- 1.2 基本程序设计思想:
- 1.3 C语言工具的特性:
- 1.4 推荐教材
- 2 GCC的使用及其常用选项介绍
- 2.1 GCC概述
- gcc -v
- gcc -o
- gcc -v -o
- 2.2 C语言编译过程
- 2.2.1 预处理
- 2.2.2 编译
- 2.2.3 汇编
- 2.2.4 链接
- 2.2.5 问题
- 2.3 宏的使用
前言
重新学习C语言,一种嵌入式C语言思想和设计的交流
视频教程:【嵌入式C语言】 https://www.bilibili.com/video/BV1RW411G7cr/?share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933
学习重点:
- 什么时候用?
- 怎么用?
- 为什么要这样设计?
1 课程介绍
1.1 计算机程序语言的学习思路?
基本程序设计思想+语言工具的特性
1.2 基本程序设计思想:
- 数据类型、运算符、条件分支、循环设计
- 面向对象的设计
1.3 C语言工具的特性:
- 比如操作底层,尤其是内存地址的寻址及操作,指针的使用
- 掌握C语言的设计思路,比普通的语法要重要的多
- 万变不离其宗,掌握C语言的核心规律。
1.4 推荐教材
- C语言深度解剖(第2版)解开程序员面试笔试的秘密
- C专家编程
- 程序员面试宝典(第4版)
- C和指针
指针不是语法有多难,而在于我们没有理解设计思想,始终对指针发怵
C语言就是人与人交流的一种高级语言,交流过程中,用一种潜意识的符号传递想表达的信息。
本课程目录
2 GCC的使用及其常用选项介绍
【重点】
掌握C语言如何变成机器指令的过程
gcc工具的几个常用选项的意义
【难点】
C编译过程中在gcc工具上的体现
【实验考核】
自己编写程序,利用gcc工具集验证每一步的执行效果
举例说明gcc选项的意义:
- gcc -l
- gcc -L
- gcc -E
- gcc -S
- gcc -c
2.1 GCC概述
GCC最初的全名是GNU C Compiler
随着GCC支持的语言越来越多,它的名称变成了GNUCompiler Collection
翻译官 翻译组织
GCC就是一个翻译官,把人能理解的语言翻译成机器语言
gcc -v
如何查看自己电脑的GCC环境呢?
在终端里输入 gcc -v即可
gcc -v
我目前使用的是Windows版本的系统
gcc -o
gcc -o output
gcc -o 输出的文件名 输入文件名
-o 输出的文件名必须要紧挨着,中间不能有其他任何选项,输入文件名 可以在输出文件名后面,也可以在-o前面,就是不能写在他们中间
我们先编写一个最简单的C语言程序
#include <stdio.h>int main(void)
{printf("Hello World!\n");return 0;
}
在终端输入如下命令,Demo001 不需要加.exe
gcc -o Demo001 .\Demo001_test.c
输入完成后,如果没有提示报错,那就是最好的了!Linux没有提示就是好的了
可以看到,输出多了一个文件
使用ls命令查看一下,确实有这个文件
运行这个文件试试
第一个是运行编译后文件,第二个是用TAB补全生成的,运行结果是一致的。
gcc -v -o
使用gcc -v -o打印这个翻译的信息
竟然输出了这么多语句
2.2 C语言编译过程
2.2.1 预处理
预处理的机制,先生成了i文件
cpp -o a.i 001.c
- 【gcc -E】
我们尝试使用这个命令,先修改一下代码
#include <stdio.h>
#define ABC 123int main(void)
{int a = ABC;printf("Hello World!\n");return 0;
}
再使用预处理的命令
gcc -E -o a.i .\Demo001_test.c
然后打开a.i,发现有800+行,我们定义的#define宏,直接被替换了,替换成对应的数字了
总结一下:预处理就是替换操作
2.2.2 编译
usr/lib/gcc/i486-linux-gnu/4.4.3/cc1 -o a.s Demo001.c
这里关注cc1,cc1是命令
把c文件生成s文件
- 【gcc -S】以后直接使用这个命令了,代替了上面的代码
现在编译了.s文件,CPU还是不认识,需要下一步,就是汇编
2.2.3 汇编
as -o a.o a.s //把a.s汇编成a.o
- 【gcc -c】 这个代码代替了上面的as
如果使用本命令,也可以直接将c文件汇编成o文件
2.2.4 链接
collect2
/usr/lib/gcc/i486-linux-gnu/4.4.3/collect2 -o ...
- 【gcc -o】这段代码代替了上面的 collect2,也包含了上面的编译和汇编,隐含着使用了【gcc -S】【gcc -c】【gcc -o】
gcc调用了不同的工具为它服务
我来试一试
gcc -S -o a.s .\Demo001_test.c
输出多了一个a.s
再使用
gcc -c -o a.o a.s
输出多了一个a.o,二进制文件,打不开
最后就是调用gcc -o
gcc -o a a.o
这就是整个过程,最后都简化了,代码如下:
gcc -o Demo001 .\Demo001_test.c
2.2.5 问题
- define 和 Include是关键字吗?
- 答案:关键字是编译器去处理的,define 和 Include都是预处理完成的,所以他们都不是关键字!!!