缓冲区
在程序和输出设备间缓冲数据fflush
库函数的使用
静态库:编译时刻将库代码链接到应用程序生成文件较大
共享:程序运行时载入共享库代码
动态:程序中语句需要使用时载入库代码
静态库的制作
1、模块化编写库模块
fun.c fun.h 就是说把需要实现的模块分开来写,而不是写在main里面
2、编译生成目标文件
fun.o
gcc -c -o obj/fun.o src/fun.c -Iinclude
3、使用目标文件生成静态库文件
libfun.a
ar -rc 库文件名 目标文件名
eg: ar -rc lib/libfun.a obj/fun.o
4、将库文件链接到主程序的目标文件中
libfun.a+main.o
gcc -o bin/main obj/main.o -Llib -lfun
-L 库文件目录路径
-l 库文件 去掉lib 和扩展名
共享库
1、模块化编写库模块
fun.c fun.h 就是说把需要实现的模块分开来写,而不是写在main里面
2、编译生成目标文件
fun.o
gcc -c -o obj/fun.o src/fun.c -Iinclude
3、生成共享库文件
libfun.so
gcc -fPCI -shared -o lib/libfun.so obj/fun.o
4、将库文件链接到主程序目标文件
libfun.so + main.o
gcc -o bin/main obj/main.o -Llib -lfun
5、将共享库配置到当前系统中
(1)将共享库拷贝到系统默认库路径下
/lib/, /usr/lib
(2)配置当前系统的环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:lib/
当简称相同的时候,扩展名不一样时,优先选择.so文件
例: libfun.so 和libfun.a共存优先选择.so文件
如何批量化的执行编译过程Makefile
批量化执行文件处理过程
desk:wood nail
make up
wood:tree
cut
nail:iron
burn
使用make执行Makefile文件
默认执行名为Makefile的文件
-f 制定执行的文件名 make -f Makefile.shared
当你修改了其中之一的文件时,再次执行make时,它会只能比较文件,只执行编译最新的文件
当你就是想要编译一下的话,那可以编写clean:项目
clean:
rm -rf obj/main.o obj/fun.o
rm -rf bin/main
使用make clean执行清理工作
警告提示
-Wall 打开所有类型语法警告 ,建议使用
-Wchar-subscripts 如果数组使用char类型变量作为下标值,则发出警告
警告warnin
编译有可能成功,会生成输出文件
错误error
语法错误,编译失败
1、编译错误一般为语法错误,容易修改
根据编译器的提示修改错误
追踪法
2、运行错误一般为逻辑错误 int *p=100 把指针强制置为100
printf(“%d”,*p);
则会报运行时错误
a、标记法
printf(“message\n”);
b、添加删除法(注释法)
c、调试法
借助调试工具进行调试debug
gdb工具+vi +gcc/g++ =Linux 下三大工具链
在使用GDB调试工具时要多加一个参数 -g
gcc -g -o sum sum.c
gdb ./bin/sum
gdb工具
list/l列出代码
run/r执行到结果
break/b 设置断点
info breakpoints/i b 查看所有断点
delete breakpoints db bumbers删除断点
next/n 单步运行不进入行数
step/s 进入函数
print/p 查看变量值
set variable 变量名=值
until/u 直接跳到某行
display 跟踪变量的值
代码优化
-O1 线程跳转和延迟退栈优化
-O2 包含O1并进行额外的调整工作
-O3 循环展开以及和处理器特性相关的优化
&&与&
&& 逻辑与 0为假 非0为真
& 按位与
|| 逻辑或
|按位或
C 语言数据类型,只有四种数据类型,C语言是强类型语言,必须定义类型
整型
浮点型
指针
聚合类型(数组和结构)
整型
字符(char),短整型(short),整型,长整型(long)
char 0~255
singed char -127~127
unsigned char 0~255
char 型
数据类型与整型的联系
ASCII码表
char ch=’9′
char ch=9;
进制类型
十进制 100
八进制 0100 —-》 64
十六进制 0x100 —>256
二进制 0b100 —->4
枚举类型
enum
溢出问题,造成数据紊乱
正溢出:超过了最大范围
负溢出:小于最低下限
a为整数,b为整数 2者皆为溢出
问:如何判断a+b不溢出
if(a>INT_MAX-b)
{
溢出?
}
标识符
变量名
函数名
宏名