嵌入式C编程 02_C高级议题.ppt

嵌入式C编程 02_C高级议题.ppt

ID:51587992

大小:1.35 MB

页数:25页

时间:2020-03-24

嵌入式C编程 02_C高级议题.ppt_第1页
嵌入式C编程 02_C高级议题.ppt_第2页
嵌入式C编程 02_C高级议题.ppt_第3页
嵌入式C编程 02_C高级议题.ppt_第4页
嵌入式C编程 02_C高级议题.ppt_第5页
资源描述:

《嵌入式C编程 02_C高级议题.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C高级议题课程安排预处理字节构造高级函数所谓预处理就是进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作,也叫预编译。所有带#的语法都在预编译时展开文件包含:#include条件编译:#if、#else、#endif、#ifdef、#ifndef宏定义:#define什么是预处理main.c:预处理:gcc–Emain.c–omain.i结果是将stdio.h在main.c中展开gcc只预处理1、一般形式为#include<文件名>或#include“文件名”文件名一般是头文件(*.h),也可以是其他文件,如汇编(*.s)例如:#include#i

2、nclude“info_t”2、尖括号表示在系统头文件目录中查找常用来引用库头文件Linux系统头文件目录:/usr/include3、双引号表示先在当前目录查找,若找不到再到系统头文件目录查找常用来引用自定义头文件如果自定义头文件不在当前目录,使用gcc的-I选项指定,如gcc–I./inc头文件包含利用条件编译,按不同的条件编译出不同的代码1、第1种形式:#if常量表达式通常用来临时屏蔽某段功能块程序段1[#else//不是必须的程序段2]#endif如果常量表达式为真(非0),则编译程序段1,否则编译程序段2条件编译2、第二种形式:#ifdef标识符程序段1[#el

3、se程序段2]#endif如果标识符已经被定义(#define)过,则编译程序段1,否则编译程序段2条件编译3、第三种形式:#ifndef标识符程序段1[#else程序段2]#endif如果标识符已经未被定义过,则编译程序段1,否则编译程序段2条件编译1、宏定义常用来为常量或者表达式取别名宏定义值是简单的替换:宏体替换宏名宏定义不是声明或预计,行末不必加分号2、不带参数宏定义#define宏名[宏体]宏体可以为空,此时宏只起到标志作用例如:#defineTRUE1#defineFALSE0常常用来为定义硬件地址:宏定义3、参数宏定义#define宏名(参数表)[宏体]宏体

4、可以省略,此时宏只起到标志作用,默认值为1例如:#defineMUL(a,b)((a)*(b))#defineADD(a,b)((a)+(b))参数没有类型,宏替换时将实参替换宏体中的形参宏定义的形参可以是标识符,但宏调用的实参可以是表达式:例如:printf(“%f”,MUL(2.5+1,3.5+1));宏体和宏体中的参数必须用()保护:例如:printf(“%d”,2*ADD(2,3));宏定义4、用宏定义和函数的区别宏定义5、多语句宏如果宏体有多条语句,须写在同一行,同时用{}保护#defineDO(a,b){a=a+b;b++;}更好的方法是使用do{}w

5、hile(0)#defineDO(a,b)do{a=a+b;b++;}while(0)也可以通过””连接符分行宏定义6、编译器预定义宏__FILE__:正在编译的文件名__LINE__:文件当前的行号__FUNCTION__:当前所在的函数名__DATE__:预编译文件的日期__TIME__:预编译文件的时间其中__FILE__、__LINE__、__FUNCTION__经常在代码调试时定位出错信息宏定义7、定义调试宏发布版本编译gcc–DNDEBUGmain.c–omain通过gcc的-D选项定义宏如:-DMAC–DMAC=1宏定义课程安排预处理字节构造高级函数1、求

6、下面结构类型大小sizeof(structB)=?字节对齐例structB{    charb;    inta;    shortc; };b04ac编译器自动补齐3个byte让a能基于4对齐编译器自动补齐2个byte让总尺寸是4的倍数2、32位CPU上,一般要求变量地址都是基于32位的(起始地址为4字节的倍数),这样可以保证CPU用一次的读写周期就可以读取变量。3、编译器都会自动把复合数据定义按CPU字对齐,以保证CPU以最快速度读取,这就是字节对齐(byteAlignment)4、对齐准则:域变量的偏移量是域类型大小的倍数整个类型大小为最大域变量类型大小的倍数字节对

7、齐1、字节序是指CPU对字取值时,解释其中各个字节的顺序如:0x1234在内存中的存储方式是1234还是3412?2、大端模式(big-endian)先存高字节,好比先吃鸡蛋的大端0x1234=>1234;0x12345678=>123456783、小端模式(little-endian)先存低字节,好比先吃鸡蛋的小端0x1234=>3412;0x12345678=>78345612字节序4、Intel的X86系列CPU为小端模式;MOTO的M68K系列CPU为大端模式;ARM系列CPU通常是可配置字节模式5、字节序测试shor

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。