-
C语言概述
- 20世纪70年代诞生于贝尔实验室(之前是汇编语言)
-
优点:
- 结构化:程序层次清晰,便于使用,维护和调试
- 模块化:
- C语言主要用于编写系统软件和应用软件。
- 用函数作为模块单位。--->减少重复编程,提高效率。
- 可移植性好
- 代码效率高
-
C语言的编辑环境
- 编辑器:vim和Emacs
- 编译连接器:GCC编译器
- 编译过程包含词法、语法、语义的分析、中间代码的生成与优化、符号表的管理、出错处理等
- 调试器:GDB对代码进行调试测试的工具。
- 项目管理器:make
作用:控制编译或者重复编译代码的工具 能自动管理编译软件编译的内容、方式和时机。
-
编辑器vim的使用
- 基本模式:
- 命令行模式(command mode) :在最下面进行对文档的操作
- 插入模式(insert mode) :进行字符的输入,按Esc退出
- 低行模式(last line mode) :以”:”开始
- 进入与离开:
- 基本操作:
进入 vi 文件名
离开 低行模式 :q(退出)
wq :x :zz(保存退出)
q!(强制退出不保存)
w(保存不退出)
w xx.c(保存到xx.c)
vs xx.c(分屏操作)
/字符(搜索字符)
%s/字符串1/字符串2/范围 (将1在范围内换成2)
r xx.c (将xx.c读取过来)
set number(nobumber) 设置行号
- 模式之间的转换:i 进入插入模式 Esc退出插入模式
- 剪切/删除、修改、复制:
range:范围 % 表示所有行
. 表示当前行
$ 最末行
剪切: nx: 光标所在字符开始的n个字符
ncb: 剪切前n个单词
ncw: 剪切后n个单词
c$: 剪切到行尾的所有字符
ndd: 剪切n行
s: 删除光标所在字符,并进入输入模式
S: 删除光标所在行,并进入输入模式
修改: r: 修改光标所在字符,并进入输入模式
R: 从光标处进入修改模式,按Esc退出
复制: nyb: 复制前n个单词
nyw: 复制后n个单词
y$: 复制从光标处到行尾
nyy: 复制从光标行起n行
:rangey复制range内的
删除: :ranged 删除range内的
粘贴: p: 将缓冲区的字符粘贴到光标处
撤回: u: 取消上一步操作
- 光标的移动:命令模式下进行
0:(数字0) 行前
$: 行尾
Ctrl+d: 向下移动半页
Ctrl+f: 向上移动半页
H: 当前屏幕第一行第一列
gg: 当前屏幕第一行第一列
M: 当前屏幕中间第一列
L: 当前屏幕最后一行第一列
b 上一个字的第一个字母
w 下一个子的第一个字母
h 向前一个字符
l 向后一个字符
k 向上移动一行
j 向下移动一行
e 下一个字的最后一个字母
^ 所在行的第一个非空白字符
n- 上移n行
n+ 下移n行
nG 移动第n行
:n 光标移动到第n行
- 查找、替换
查找: /<查找的字符>
?<查找的字符>
替换: :range() s/str1/str2/g(可选标志)c (替换前询问)
:10,20 s/str1/str2/ 10-20行第一个str1替换为str2
:2,$-5 s/str1/str2/g 2-倒数第5行所有的str1替换str2
-
- :
- 编译器GCC的使用
- GCC概述:
编译流程分为4步: 预处理(pre-processing)-
gcc-E-o <目标文件><编译文件> gcc-E-o .i .c
编译(compiling)
gcc-S-o .s .i
汇编(assembling)
gcc-c .s -o .o
链接(linking)
gcc .o -o xx
- gcc警告提示:对错误分别指定警告
gcc -Wall .c -o xx
- GCC使用函数库
- 函数库分为静态库(编译时链接)和共享库(运行时加载)。都安装在“/user/lib”和“/lib”目录下
- 共享库后缀.so如libm.so.5 m数学库.so共享库.5版本号
静态库后缀.a 如libm.a m数学库.a静态库
-
- 指定文件夹下的库(一般是自己写的函数功能):#include</root/workplace/gcc>导入
- GCC代码优化
-On n代表优化等级:0到2或者3
- 调试器GDB的使用
使用时机: 能够编译,但是运行结果不对劲,
使用语句: gcc .c -o xx -g
gdb xx
输入l,就会出现待编译的代码,这时就能对其进行操作
-
- 基本功能及操作
- 设置断点: b+行号
- 查看断点: info b
- 运行代码: r 运行到断点处停止
- 查看变量值: p+变量名
- 观察变量: watch n 在n处设置了观察点
- 单步运行: n 下一行
- 程序继续运行:c 持续运行直到断点或者程序结束
- 退出GDB: q
-
- 设置删除断点
- brieak+行号 :设置断点
- tbreak+行号或函数名 :设置一次性断点
- break+filename+行号 :在文件中对应行设置断点
- break+<0x...> :在内存中某一位置暂停
- clear+行号 :清除对应行的断点
- 数据相关命令
display+表达式: 显示表达式的值。程序运行到断点时显示。
info display: 显示当前所有显示值的表达式的有关情况
delete display 编号: 删除要显示值的表达式
print(p)+变量或者表达式: 打印变量或者表达式的值
set+变量 = 变量值: 改变程序中变量的值
-
- 调式运行环境相关命令
set args 设置运行参数
show args 显示运行参数
set width+数目 设置GDB行宽
cd+工作目录 切换工作目录
run 程序开始执行
step(s) 单步执行(会进入到子函数中)
next(n) 单步执行(不会进入到子函数中)
finish 一直运行到函数结束返回
until+行数 运行到函数某一行
continue(c) 执行到下一个断点或程序结束
return<返回值> 直接结束当前函数,并将指定值返回
call+函数 在当前位置执行要运行的函数
-
- 堆栈相关命令
backtrace(bt) 打印栈帧指针,可以在命令后加上要打印的个数
frame 打印栈帧
info reg 查看寄存器使用情况
info stack 查看堆栈情况
up 跳到上一层函数
down 跳到下一层函数
- make 自动编译管理器
作用:根据文件时间戳自动发现更新过的文件从而减少编译的工作量。
通过读入Makefile文件的内容执行大量编译工作,用户只需要编写一次编译语句。
- Makefile文件的基本结构
- 目标体:依赖文件
执行的命令
hello.o:hello.c hello.h
一个Tab接命令gcc-c hello.c-o hello.o
- Makefile变量
定义的方式:(1) VAR=var
- VAR: =var
使用方式:$(VAR)
常见的自动变量:
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,并以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
- Makefile规则
所有的.o文件都可以由.c文件自动转换而来
- make的使用
使用方法:make <目标名> 没有目标名就运行Makefile中第一个目标
其他命令执行项:
-C 读入指定目录下的Makefile文件
-f 读入当前目录下的file文件作为Makefile文件
-i 忽略所有的命令执行错误
-I 指定被包含的Makefile所在目录
-n 只打印要执行的命令,但不执行这些命令
-p 显示make变量数据库和隐式规则
-s 在执行命令时不显示命令
-w 如果make在执行过程中改变目录,打印当前目录名