嵌入式系统常用c语言基本语法概要

上传人:wt****50 文档编号:44111361 上传时间:2018-06-08 格式:PDF 页数:13 大小:364.08KB
返回 下载 相关 举报
嵌入式系统常用c语言基本语法概要_第1页
第1页 / 共13页
嵌入式系统常用c语言基本语法概要_第2页
第2页 / 共13页
嵌入式系统常用c语言基本语法概要_第3页
第3页 / 共13页
嵌入式系统常用c语言基本语法概要_第4页
第4页 / 共13页
嵌入式系统常用c语言基本语法概要_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《嵌入式系统常用c语言基本语法概要》由会员分享,可在线阅读,更多相关《嵌入式系统常用c语言基本语法概要(13页珍藏版)》请在金锄头文库上搜索。

1、 嵌入式系统常用 C 语言基本语法概要 1.7 嵌入式系统常用的C语言基本语法概要 C 语言是在 70 年代初问世的。1978 年美国电话电报公司(AT Pstudent-age=18; 实际上,Pstudent-name 就是(*Pstudent).name 的缩写形式。 需要指出的是结构体指针是指向结构体的一个指针,即结构体中第一个成员的首地址, 因此在使用之前应该对结构体指针初始化, 即分配整个结构体长度的字节空间。 这可用下面 函数完成: Pstudent=(struct student*)malloc(sizeof (struct student); sizeof(struct st

2、udent)自动求取 student 结构体的字节长度,malloc()函数定义了一个 大小为结构体长度的内存区域,然后将其地址作为结构体指针返回。 7位域 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例 如在存放一个开关量时,只有 0 和 1 两种状态,用一位二进位即可。为了节省存储空间,并 使处理简便, C 语言又提供了一种数据结构, 称为“位域 (bit field) ”, 也有人翻译为“位段”。 所谓“位域”,实际上是字节中一些位的组合,可以认为它是“位信息组”。位域将一个字节中的二进位划分为几个不同的区域,并给每个区域起个域名,允许在程序中按域名进行操作

3、。 1)位域的定义 【例如】定义一个名为 bs 的位域变量类型,同时声明 b1 为 bs 类型的变量。 struct bs unsigned int a:2; /第 01 位 unsigned int b:6; /第 27 位 b1; 注意:定义位域必须使用“unsigned int”。上例声明 b1 为 bs 变量,共占 8 位(1 字节) 。 其中位域 a 占 2 位(a 的范围为 03) ,位域 b 占 6 位(b 的范围为 063) 。对于位域的定 义尚有以下几点说明: (1)一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够 存放另一位域时,应从下一单元起存放该位

4、域。也可以有意使某位域从下一单元开始。 【例如】 : struct bs unsigned int a:4 unsigned int :0 /空域(本字节剩余位不用) unsigned int b:4 /从下一单元开始存放 unsigned int c:4 ; 在这个位域定义中, a 占第一字节的 4 位, 后 4 位填 0 表示不使用, b 从第二字节开始, 占用 4 位,c 占用 4 位。 (2)由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是 说不能超过 8 位二进位。 (3) 位域可以无位域名, 这时它只用来作填充或调整位置。 无名的位域是不能使用的。 【例如】

5、: struct k unsigned int a:1 /第 0 位 unsigned int :2 /无域名,2 位不能使用 unsigned int b:3 /第 35 位 unsigned int c:2 /第 67 位 b1; 从以上分析可以看出, 位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。 2)位域的使用 位域的使用和结构成员的使用相同,其一般形式为: 位域变量名 位域名 例如在上面定义的位域 b1 可以这样调用: b1.a=1; /将 b1 的第 0 位置 1(注意一个字节从最低位开始) b1.b=7; /将 b1 的第 35 位置 111 通过位域定义位变量,是

6、实现单个位操作的重要途径和方法,采用位域定义位变量,产 生的代码紧凑、高效。 8编译预处理 C 语言提供编译预处理的功能,“编译预处理”是 C 编译系统的一个重要组成部分。C 语 言允许在程序中使用几种特殊的命令(它们不是一般的 C 语句) 。在 C 编译系统对程序进行 通常的编译(包括语法分析、代码生成、优化等)之前,先对程序中的这些特殊的命令进行 “预处理”,然后将预处理的结果和源程序一起再进行常规的编译处理,以得到目标代码。C 提供的预处理功能主要有宏定义、条件编译和文件包含。 1)宏定义 #define 宏名 表达式 表达式可以是数字、字符,也可以是若干条语句。在编译时,所有引用该宏的

7、地方,都 将自动被替换成宏所代表的表达式。 【例如】 : #define PI 3.1415926 /以后程序中用到数字 3.1415926 就写 PI #define S(r) PI*r*r /以后程序中用到 PI*r*r 就写 S(r) 2)条件编译 #if 表达式 #else 表达式 #endif 如果表达式成立,则编译#if 下的程序,否则编译#else 下的程序,#endif 为条件编译的 结束标志。 #ifdef 宏名 /如果宏名称被定义过,则编译以下程序 #ifndef 宏名 /如果宏名称未被定义过,则编译以下程序 条件编译通常用来调试、保留程序(但不编译) ,或者在需要对两种状

8、况做不同处理时 使用。 3)“文件包含”处理 所谓“文件包含”是指一个源文件将另一个源文件的全部内容包含进来,其一般形式为: #include “文件名” 9用typedef定义类型 除了可以直接使用 C 提供的标准类型名(如 int、char、float、double、long 等)和自己 定义的结构体、指针、枚举等类型外,还可以用 typedef 定义新的类型名来代替已有的类型 名。 【例如】 : typedef unsigned char INT8U; 指定用 INT8U 代表 unsigned char 类型。这样下面的两个语句是等价的: unsigned char i; 等价于 IN

9、T8U i; 用法说明: (1)用 typedef 可以定义各种类型名,但不能用来定义变量。 (2)用 typedef 只是对已经存在的类型增加一个类型别名,而没有创造新的类型。 (3)typedef 与#define 有相似之处,如: typedef unsigned int INT16U; #define INT16U unsigned int; 这两句的作用都是用 INT16U 代表 unsigned int。但事实上它们二者不同,#define 是在 预编译时处理,它只能做简单的字符串替代,而 typedef 是在编译时处理。 (4)当不同源文件中用到各种类型数据(尤其是像数组、指针、

10、结构体、共用体等较复杂数据类型)时,常用 typedef 定义一些数据类型,并把它们单独存放在一个文件中,而 后在需要用到它们的文件中用#include 命令把它们包含进来。 (5)使用 typedef 有利于程序的通用与移植。 1.8 嵌入式系统常用的C+语言概要 C+语言以及 EC+语言也是当今的主流编程语言,均根植于 C 语言。本节将在上节的 基础上,简要阐述 C+(包括 EC+)的特性,与 C 语言相同或者相近的部分不再赘述。 1.8.1 概述 1C+的来源和发展 C+源于 C 语言,而 C 语言是在 B 语言的基础上发展起来的。 1960 年出现了一种面向问题的高级语言 ALGOL

11、60。 1963 年英国剑桥大学推出了 CPL(Combined Programming Language)语言,后来经简 化为 BCPL 语言。 1970 年美国贝尔(Bell)实验室的 K.Thompson 以 BCPL 语言为基础,设计了一种类似 于 BCPL 的语言,取其第一字母 B,称为 B 语言。 1972 年美国贝尔实验室的 Dennis M.Ritchie 为克服 B 语言的诸多不足,在 B 语言的基 础上重新设计了一种语言,取其第二字母 C,故称为 C 语言。 1980 年贝尔实验室的 Bjarne Stroustrup 对 C 语言进行了扩充,推出了“带类的 C”,多次 修

12、改后起名为 C+。以后又经过不断的改进,发展成为今天的 C+。 C+改进了 C 的不足之处,支持面向对象的程序设计,在改进的同时保持了 C 的简洁 性和高效性。 2C+的特点 C+的主要特点:封装性,继承性,多态性,抽象性。 封装性封装性: 也就是把客观事物封装成抽象的类, 并且类可以把自己的数据和方法只让可信 的类或者对操作,对不可信的进行信息隐藏。 抽象性抽象性:程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。 多态性多态性: 函数的多态性是指一个函数被定义成多个不同参数的函数, 它们一般被存在头 文件中,当你调用这个函数,针对不同的参数,就会调用不同的同名函数。 C+

13、中的多态性通过虚函数(virtual function)来实现的。 继承性继承性:允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典 型地来说就是用类来对组件进行分组, 而且还可以定义新类为现存的类的扩展, 这样就可以 将类组织成树形或网状结构,这体现了动作的通用性。 3EC+与标准C+的不同 EC+的产生是由嵌入式发展带动起来的。C+语言编写大型工程有着非常大的优势, 但直接应用与嵌入式系统是不行的,主要有两个方面的原因。 C+程序代码编译后很大,适用与普通计算机用户,但在嵌入式系统中,要求代码编 译后能在很小的存储器里顺畅的运行,这就需要很小的代码。 C+运行时间较长,不

14、适合片上实时系统的要求。 EC+是标准 C+语言的一个子集,它从 C+语法中剔除了一些实现复杂和会导致额外 负担语法元素。例如:多重继承与虚基类、RTTI、异常处理、模版、命名空间等等。同时,在标准库方面, EC+规范也做了删减, STL 和 Stream 等被剔除了。 在 EC+规范出炉之后。 很多嵌入式厂商都推出了符合 EC+规范的编译器,在嵌入式领域有一定的影响。 1.8.2 面向对象编程 面向对象的程序设计(Object-Oriented Programming,简记为 OOP)立意于创建软件重用 代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。它 通过给

15、程序中加入扩展语句,把函数“封装”进编程所必需的“对象”中。面向对象的编程语言 使得复杂的工作条理清晰、编写容易。 面向对象编程代码很容易维护,容易理解和重复使用,这些就是软件工程的基础。面向 对象编程具有重用性、灵活性和扩展性。符合软件工程的思想。 1对象与类 对象(Object)是一个现实实体的抽象,由现实实体的过程或信息来定义。一个对象可被 认为是一个把数据(属性)和程序(方法)封装在一起的实体,这个程序产生该对象的动作 或对它接受到的外界信号的反应。这些对象操作有时称为方法。对象是个动态的概念,其中 的属性反映了对象当前的状态。 类(Class)实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中 一类具有共同特征的事物的抽象,是面向对象编程的基础。 类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性 和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的 一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建 多个相同类型的对象。 可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图,但在内存中并不存在。 从这个蓝图可以创建任何数量的对象。从类创建的所有对象都有相

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号