linux笔记——C语言高级编程

gcc编译器

GNU工具

编译工具:把一个源程序编译为一个可执行程序
调试程序:能对执行程序进行源码或汇编级调试
软件工程工具:协助多人开发或大型软件项目的管理,如make、CVS、Subvision

部分相关资源:
http://www.gnu.org/
http://gcc.gnu.org/
http://www/kernel.org/
http://www.linux.org/
http://www.linuxdevices.com/
http://sourceforge.net/index.php

gcc简介:全称GNU gcc,符合ANSI C标准的编译系统
,编译c、c++、object C、java、fortran、pascal等,是一个交叉平台编译器,适合在嵌入式领域的开发编译

gcc所支持后缀名:
linux笔记——C语言高级编程_第1张图片

编译器的主要组件

分析器:将源代码转换为汇编语言
汇编器:将汇编代码转换为CPU可执行字节码
链接器:将汇编器生成的单独的目标文件组合成可执行的应用程序
标准C库:核心的c函数都有一个主要的c库来提供

gcc基本用法和选项

gcc [options] [filnames]

linux笔记——C语言高级编程_第2张图片
gcc错误类型及对策:

  • c语法错误
    错误信息:文件source.c中第n行有语法错误(syntex error)
  • 头文件错误:
    找不到头文件head.h表示有文件名错误、指定的头文件所在目录名错误等
  • 档案库错误:
    链接程序找不到所需的函数库(id:-lm:No such file or directory)可能是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称
  • 未定义符号:有未定义的符号(underfined symbol)

gcc使用实例:

#include
int main (void){
int i,j;
j=0;
i=j+1;
printf("hello,wolrd\n");
printf("the result is %d\n",i);
}

编译:

$gcc -o test test.c

执行:

$./test

查看更详细的信息:

$gcc -v -o test test.c

gcc编译过程

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接
    linux笔记——C语言高级编程_第3张图片
    生成预处理代码:
$gcc -E test.c -o test,i

用wc命令,查看这两个阶段代码大小

$wc test.c test.i

生成汇编代码:
检查语法错误,并生成汇编文件

$gcc -s test.i -o test.s

gdb调试工具

首先使用gcc对test.c进行编译,注意一定要加上-g

gcc -g test.c -o test
gdb test

条件编译和共用体

条件编译

编译器根据条件的真假决定是否编译相关的代码,常见条件编译:

  • 根据宏是否被定义:
#ifdef 
......
#else
......
#endif
  • 根据宏的值:
#if 
......
#else
.......
#endif

共用体

不同数据类型的数据可以使用共同存储区域,共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同在于使用内存的方式上。

union 共用体名{
    成员列表;}

用关键字typedef定义新的数据类型:

typedef  <已有数据类型>  <新数据类型>

例如:
typedef int INTEGER

内存管理

4个内存区间:代码区、全局变量和静态变量去、局部变量去即栈区、动态存储区即堆取

静态存储分配

  • 通常定义变量,编译器在编译时都可以根据该变量的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。
  • 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限

动态内存

动态存储分配
  • 所有动态存储分配都在堆区中进行
  • 有些操作对象只能在程序运行时确定,编译器在编译时无法预订存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配
  • 程序在运行的时候用malloc申请任意多少的内存,程序员自己负责在何时用free释放内存
堆内存的分配与释放
  • 当不再使用该变量或对象时,要显示释放它所占用的存储空间。
  • 堆区不会自动在分配时初始化(包括清零),所以必须要初始化式来显示初始化。
  • malloc/free:

void malloc(size_t num)
void free(void
p)

malloc函数本身不识别申请的内存类型,只关心内存总字节数;malloc申请的是一块连续的内存,申请不到用NULL;malloc返回值类型是void*,所以在调用时需要显式的进行类型转换,将void*转换成所需要的的指针类型;如果free参数为NULL没有任何效果;释放一块内存中的一部分不被允许

** mallo/free注意事项:**

  • 删除一个指针(free§;)实际指删除了p所指的目标(量或对象),释放它所占的堆空间,不是删除p本身,释放堆空间后,p成了空悬指针。
  • 动态分配失败返回一个空指针(NULL),表示发生了异常堆资源不足,分配失败
  • malloc与free是配对使用的,free只能释放堆空间。若malloc返回指针值丢失则所分配的堆空间无法回收,称为内存泄漏

野指针:指向“垃圾”内存的指针。成因:指针变量没有被初始化;指针被free之后没有置为NULL,被误认为是合法指针,指针操作超越了变量的作用范围

你可能感兴趣的:(嵌入式)