专题三 - 编译预处理.pdf

上传人:安*** 文档编号:19245566 上传时间:2022-06-05 格式:PDF 页数:49 大小:7.69MB
返回 下载 相关 举报
专题三 - 编译预处理.pdf_第1页
第1页 / 共49页
专题三 - 编译预处理.pdf_第2页
第2页 / 共49页
点击查看更多>>
资源描述

《专题三 - 编译预处理.pdf》由会员分享,可在线阅读,更多相关《专题三 - 编译预处理.pdf(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、版权声明版权声明版权声明版权声明:本课件及其印刷物本课件及其印刷物本课件及其印刷物本课件及其印刷物、视频的版权归成都国嵌信息技术有限公司所有视频的版权归成都国嵌信息技术有限公司所有视频的版权归成都国嵌信息技术有限公司所有视频的版权归成都国嵌信息技术有限公司所有,并保留所有权力并保留所有权力并保留所有权力并保留所有权力:任何单任何单任何单任何单位或个人未经成都国嵌信息技术有限公司书面授权位或个人未经成都国嵌信息技术有限公司书面授权位或个人未经成都国嵌信息技术有限公司书面授权位或个人未经成都国嵌信息技术有限公司书面授权,不得使用该课件及其印刷物不得使用该课件及其印刷物不得使用该课件及其印刷物不得使

2、用该课件及其印刷物、视频从事商业视频从事商业视频从事商业视频从事商业、教学活教学活教学活教学活动动动动。已经取得书面授权的已经取得书面授权的已经取得书面授权的已经取得书面授权的,应在授权范围内使用应在授权范围内使用应在授权范围内使用应在授权范围内使用,并注明并注明并注明并注明“来源来源来源来源:国嵌国嵌国嵌国嵌”。违反上述声明者违反上述声明者违反上述声明者违反上述声明者,我们将追究其我们将追究其我们将追究其我们将追究其法律责任法律责任法律责任法律责任。专题三专题三专题三专题三编译预处理编译预处理编译预处理编译预处理嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号:

3、 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents编译过程简介编译过程简介编译过程简介编译过程简介宏定义与使用分析宏定义与使用分析宏定义与使用分析宏定义与使用分析条件编译使用分析条件编译使用分析条件编译使用分析条件编译使用分析#error和和和和#嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents#pragma预处理分析预处理分析预处理分析预处理分析

4、#和和和和#运算符使用解析运算符使用解析运算符使用解析运算符使用解析嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents编译过程简介编译过程简介编译过程简介编译过程简介宏定义与使用分析宏定义与使用分析宏定义与使用分析宏定义与使用分析条件编译使用分析条件编译使用分析条件编译使用分析条件编译使用分析#error和和和和#嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌

5、入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116被隐藏了过程被隐藏了过程被隐藏了过程被隐藏了过程? 你不知道的事你不知道的事你不知道的事你不知道的事。file.cfile.h预处理器cppfile.i编译器gccfile.s汇编器asfile.olibc.a链接器嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116编译器做了什么编译器做了什么编译器做了什么编译器做了什么?预编译预编译预编译预编译处理所有的注释处理所有的注

6、释处理所有的注释处理所有的注释,以空格代替以空格代替以空格代替以空格代替将所有的将所有的将所有的将所有的#define删除删除删除删除,并且展开所有的宏定义并且展开所有的宏定义并且展开所有的宏定义并且展开所有的宏定义处理条件编译指令处理条件编译指令处理条件编译指令处理条件编译指令#if, #ifdef, #elif, #else, #endif处理处理处理处理#include,展开被包含的文件展开被包含的文件展开被包含的文件展开被包含的文件保留编译器需要使用的保留编译器需要使用的保留编译器需要使用的保留编译器需要使用的#pragma指令指令指令指令预处理指令预处理指令预处理指令预处理指令:gc

7、c E file.c o 嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116编译器做了什么编译器做了什么编译器做了什么编译器做了什么?编译编译编译编译对预处理文件进行一系列词法分析对预处理文件进行一系列词法分析对预处理文件进行一系列词法分析对预处理文件进行一系列词法分析,语法分析和语义分析语法分析和语义分析语法分析和语义分析语法分析和语义分析词法分析主要分析关键字词法分析主要分析关键字词法分析主要分析关键字词法分析主要分析关键字,标示符标示符标示符

8、标示符,立即数等是否合法立即数等是否合法立即数等是否合法立即数等是否合法语法分析主要分析表达式是否遵循语法规则语法分析主要分析表达式是否遵循语法规则语法分析主要分析表达式是否遵循语法规则语法分析主要分析表达式是否遵循语法规则语义分析在语法分析的基础上进一步分析表达式是否合法语义分析在语法分析的基础上进一步分析表达式是否合法语义分析在语法分析的基础上进一步分析表达式是否合法语义分析在语法分析的基础上进一步分析表达式是否合法分析结束后进行代码优化生成相应的汇编代码文件分析结束后进行代码优化生成相应的汇编代码文件分析结束后进行代码优化生成相应的汇编代码文件分析结束后进行代码优化生成相应的汇编代码文件

9、编译指令编译指令编译指令编译指令:gcc S file.c o 嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116编译器做了什么编译器做了什么编译器做了什么编译器做了什么?汇编汇编汇编汇编汇编器将汇编代码转变为机器可以执行的指令汇编器将汇编代码转变为机器可以执行的指令汇编器将汇编代码转变为机器可以执行的指令汇编器将汇编代码转变为机器可以执行的指令每个汇编语句几乎都对应一条机器指令每个汇编语句几乎都对应一条机器指令每个汇编语句几乎都对应一条机器指令每

10、个汇编语句几乎都对应一条机器指令汇编指令汇编指令汇编指令汇编指令:gcc c file.s o 嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116源码单步编译示例源码单步编译示例源码单步编译示例源码单步编译示例理解编译器的行为理解编译器的行为理解编译器的行为理解编译器的行为实例分析实例分析实例分析实例分析1-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流

11、学习交流学习交流学习交流QQ群群群群: 65212116链接器的意义链接器的意义链接器的意义链接器的意义连接器的主要作用是把各个模块之间相互引用的部分连接器的主要作用是把各个模块之间相互引用的部分连接器的主要作用是把各个模块之间相互引用的部分连接器的主要作用是把各个模块之间相互引用的部分处理好处理好处理好处理好,使得各个模块之间能够正确的衔接使得各个模块之间能够正确的衔接使得各个模块之间能够正确的衔接使得各个模块之间能够正确的衔接。嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交

12、流QQ群群群群: 65212116模块拼装模块拼装模块拼装模块拼装?静态链接静态链接静态链接静态链接file1.ofile2.olibc.a链接器嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116模块拼装模块拼装模块拼装模块拼装?动态链接动态链接动态链接动态链接file1.cfile1.olib1.so链接器linkera.out编译器嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌

13、入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116小结小结小结小结? 编译器将编译工作主要分为预处理编译器将编译工作主要分为预处理编译器将编译工作主要分为预处理编译器将编译工作主要分为预处理,编译和汇编三部编译和汇编三部编译和汇编三部编译和汇编三部? 连接器的工作是把各个独立的模块链接为可执行程序连接器的工作是把各个独立的模块链接为可执行程序连接器的工作是把各个独立的模块链接为可执行程序连接器的工作是把各个独立的模块链接为可执行程序? 静态链接在编译期完成静态链接在编译期完成静态链接在编译期完成静态链接在编译期完成,动态链接在运行期完成动态链接在运行期完成动态

14、链接在运行期完成动态链接在运行期完成嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents编译过程简介编译过程简介编译过程简介编译过程简介宏定义与使用分析宏定义与使用分析宏定义与使用分析宏定义与使用分析条件编译使用分析条件编译使用分析条件编译使用分析条件编译使用分析#error和和和和#嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学

15、习交流学习交流QQ群群群群: 65212116定义宏常量定义宏常量定义宏常量定义宏常量? #define定义宏常量可以出现在代码的任何地方定义宏常量可以出现在代码的任何地方定义宏常量可以出现在代码的任何地方定义宏常量可以出现在代码的任何地方? #define从本行开始从本行开始从本行开始从本行开始,之后的代码都可以使用这个宏常量之后的代码都可以使用这个宏常量之后的代码都可以使用这个宏常量之后的代码都可以使用这个宏常量以上定义那些是正确的以上定义那些是正确的以上定义那些是正确的以上定义那些是正确的?那些是错误的那些是错误的那些是错误的那些是错误的?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨

16、询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116定义宏表达式定义宏表达式定义宏表达式定义宏表达式? #define表达式给有函数调用的假象表达式给有函数调用的假象表达式给有函数调用的假象表达式给有函数调用的假象,却不是函数却不是函数却不是函数却不是函数? #define表达式可以比函数更强大表达式可以比函数更强大表达式可以比函数更强大表达式可以比函数更强大? #define表达式比函数更容易出错表达式比函数更容易出错表达式比函数更容易出错表达式比函数更容易出错以上宏表达式有没有问题以上宏表达式

17、有没有问题以上宏表达式有没有问题以上宏表达式有没有问题?完全等价于函数吗完全等价于函数吗完全等价于函数吗完全等价于函数吗?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116宏代码块的定义宏代码块的定义宏代码块的定义宏代码块的定义宏强于函数的优势宏强于函数的优势宏强于函数的优势宏强于函数的优势实例分析实例分析实例分析实例分析2-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式

18、Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116宏表达式与函数的对比宏表达式与函数的对比宏表达式与函数的对比宏表达式与函数的对比? 宏表达式在预编译期被处理宏表达式在预编译期被处理宏表达式在预编译期被处理宏表达式在预编译期被处理,编译器不知道宏表达式编译器不知道宏表达式编译器不知道宏表达式编译器不知道宏表达式的存在的存在的存在的存在? 宏表达式用宏表达式用宏表达式用宏表达式用“实参实参实参实参”完全替代形参完全替代形参完全替代形参完全替代形参,不进行任何运算不进行任何运算不进行任何运算不进行任何运算? 宏表达式没有任何的宏表达式没有任何的宏表达式没有任何的宏表达式没有

19、任何的“调用调用调用调用”开销开销开销开销? 宏表达式中不能出现递归定义宏表达式中不能出现递归定义宏表达式中不能出现递归定义宏表达式中不能出现递归定义嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116你见过你见过你见过你见过#undef吗吗吗吗?? 宏定义的常量或表达式是否有作用域限制宏定义的常量或表达式是否有作用域限制宏定义的常量或表达式是否有作用域限制宏定义的常量或表达式是否有作用域限制?example2-嵌入式嵌入式嵌入式嵌入式Linux技术

20、咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116强大的内置宏强大的内置宏强大的内置宏强大的内置宏1编译器是否遵循标准编译器是否遵循标准编译器是否遵循标准编译器是否遵循标准C规规规规范范范范_STDC_17:01:01编译时的时间编译时的时间编译时的时间编译时的时间_TIME_Jan 31 2012编译时的日期编译时的日期编译时的日期编译时的日期_DATE_25当前行号当前行号当前行号当前行号_LINE_file1.c被编译的文件名被编译的文件名被编译的文件名被编译的文件名_FILE_

21、示例示例示例示例含义含义含义含义宏宏宏宏嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116手把手教你写代码手把手教你写代码手把手教你写代码手把手教你写代码定义日志宏定义日志宏定义日志宏定义日志宏嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116课后思考课后思考课后思考课后思考?#define f (x)

22、 (x)-1)?上面的宏定义代表什么意思上面的宏定义代表什么意思上面的宏定义代表什么意思上面的宏定义代表什么意思??宏定义对空格敏感吗宏定义对空格敏感吗宏定义对空格敏感吗宏定义对空格敏感吗?宏宏宏宏“调用调用调用调用”对空格敏感吗对空格敏感吗对空格敏感吗对空格敏感吗?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents编译过程简介编译过程简介编译过程简介编译过程简介宏定义与使用分析宏定义与使用分析宏定义与使用分析宏定义与使用分析条件编

23、译使用分析条件编译使用分析条件编译使用分析条件编译使用分析#error和和和和#嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116基本概念基本概念基本概念基本概念? 条件编译的行为类似于条件编译的行为类似于条件编译的行为类似于条件编译的行为类似于C语言中的语言中的语言中的语言中的ifelse? 条件编译是预编译指示命令条件编译是预编译指示命令条件编译是预编译指示命令条件编译是预编译指示命令,用于控制是否编译某段代码用于控制是否编译某段代码用于控制是

24、否编译某段代码用于控制是否编译某段代码和和和和if语句真的有语句真的有语句真的有语句真的有区别吗区别吗区别吗区别吗?example3-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#include的困惑的困惑的困惑的困惑? #include的本质是将已经存在的文件内容嵌入到当前文件中的本质是将已经存在的文件内容嵌入到当前文件中的本质是将已经存在的文件内容嵌入到当前文件中的本质是将已经存在的文件内容嵌入到当前文件中? #include的间接包含同

25、样会产生嵌入文件内容的动作的间接包含同样会产生嵌入文件内容的动作的间接包含同样会产生嵌入文件内容的动作的间接包含同样会产生嵌入文件内容的动作test.cstdio.htest.hglobal.h问题问题问题问题:间接包含同一个头文件是否会产生编译错误间接包含同一个头文件是否会产生编译错误间接包含同一个头文件是否会产生编译错误间接包含同一个头文件是否会产生编译错误?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116条件编译的使用条件编译的使用条件编译

26、的使用条件编译的使用如何随心所欲的包含头文件如何随心所欲的包含头文件如何随心所欲的包含头文件如何随心所欲的包含头文件实例分析实例分析实例分析实例分析3-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116条件编译的意义条件编译的意义条件编译的意义条件编译的意义? 条件编译使得我们可以按不同的条件编译不同的代码段条件编译使得我们可以按不同的条件编译不同的代码段条件编译使得我们可以按不同的条件编译不同的代码段条件编译使得我们可以按不同的条件编译不同的代码

27、段,因而可以产生不同的目标代码因而可以产生不同的目标代码因而可以产生不同的目标代码因而可以产生不同的目标代码? #if#else#endif被预编译器处理被预编译器处理被预编译器处理被预编译器处理;而而而而ifelse语句被语句被语句被语句被编译器处理编译器处理编译器处理编译器处理,必然被编译进目标代码必然被编译进目标代码必然被编译进目标代码必然被编译进目标代码? 实际工程中条件编译主要用于一下两种情况实际工程中条件编译主要用于一下两种情况实际工程中条件编译主要用于一下两种情况实际工程中条件编译主要用于一下两种情况:? 不同的产品线共用一份代码不同的产品线共用一份代码不同的产品线共用一份代码不

28、同的产品线共用一份代码? 区分编译产品的调试版和发布版区分编译产品的调试版和发布版区分编译产品的调试版和发布版区分编译产品的调试版和发布版嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116条件编译的使用条件编译的使用条件编译的使用条件编译的使用产品线区分及调试代码应用产品线区分及调试代码应用产品线区分及调试代码应用产品线区分及调试代码应用实例分析实例分析实例分析实例分析3-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号

29、号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116小结小结小结小结? 通过编译器命令行能够定义预处理器使用的宏通过编译器命令行能够定义预处理器使用的宏通过编译器命令行能够定义预处理器使用的宏通过编译器命令行能够定义预处理器使用的宏? 条件编译可以避免重复包含头同一个头文件条件编译可以避免重复包含头同一个头文件条件编译可以避免重复包含头同一个头文件条件编译可以避免重复包含头同一个头文件? 条件编译是在工程开发中可以区别不同产品线的代码条件编译是在工程开发中可以区别不同产品线的代码条件编译是在工程开发中可以区别不同产品线的代码

30、条件编译是在工程开发中可以区别不同产品线的代码? 条件编译可以定义产品的发布版和调试版条件编译可以定义产品的发布版和调试版条件编译可以定义产品的发布版和调试版条件编译可以定义产品的发布版和调试版嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents编译过程简介编译过程简介编译过程简介编译过程简介宏定义与使用分析宏定义与使用分析宏定义与使用分析宏定义与使用分析条件编译使用分析条件编译使用分析条件编译使用分析条件编译使用分析#error和和

31、和和#嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#error的用法的用法的用法的用法? #error用于生成一个编译错误消息用于生成一个编译错误消息用于生成一个编译错误消息用于生成一个编译错误消息,并停止编译并停止编译并停止编译并停止编译? 用法用法用法用法#error message注注注注:message不需要用双引号包围不需要用双引号包围不需要用双引号包围不需要用双引号包围#error编译指示字用于自定义程序员特有的编译错误消息编译指

32、示字用于自定义程序员特有的编译错误消息编译指示字用于自定义程序员特有的编译错误消息编译指示字用于自定义程序员特有的编译错误消息类似的类似的类似的类似的,#warning用于生成编译警告用于生成编译警告用于生成编译警告用于生成编译警告,但不会停止编译但不会停止编译但不会停止编译但不会停止编译嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#error和和和和#warning的使用的使用的使用的使用自定义错误消息自定义错误消息自定义错误消息自定义错误

33、消息实例分析实例分析实例分析实例分析4-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#line的用法的用法的用法的用法? #line用于强制指定新的行号和编译文件名用于强制指定新的行号和编译文件名用于强制指定新的行号和编译文件名用于强制指定新的行号和编译文件名,并对源程序并对源程序并对源程序并对源程序的代码重新编号的代码重新编号的代码重新编号的代码重新编号? 用法用法用法用法#line number filename注注注注:filename

34、可省略可省略可省略可省略#line编译指示字的本质是重定义编译指示字的本质是重定义编译指示字的本质是重定义编译指示字的本质是重定义_LINE_和和和和_FILE_嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#line的使用的使用的使用的使用重定义行号和文件名重定义行号和文件名重定义行号和文件名重定义行号和文件名实例分析实例分析实例分析实例分析4-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 55049159

35、6嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents#pragma预处理分析预处理分析预处理分析预处理分析#和和和和#运算符使用解析运算符使用解析运算符使用解析运算符使用解析嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#pragma简介简介简介简介? #pragma是编译器指示字是编译器指示字是编译器指示字是编译器指示字,用于指示编译器完成一些特定的动作用于指示编译器完成一些特定

36、的动作用于指示编译器完成一些特定的动作用于指示编译器完成一些特定的动作? #pragma所定义的很多指示字是编译器和操作系统特有的所定义的很多指示字是编译器和操作系统特有的所定义的很多指示字是编译器和操作系统特有的所定义的很多指示字是编译器和操作系统特有的? #pragma在不同的编译器间是不可移植的在不同的编译器间是不可移植的在不同的编译器间是不可移植的在不同的编译器间是不可移植的?预处理器将忽略它不认识的预处理器将忽略它不认识的预处理器将忽略它不认识的预处理器将忽略它不认识的#pragma指令指令指令指令?两个不同的编译器可能以两种不同的方式解释同一条两个不同的编译器可能以两种不同的方式解

37、释同一条两个不同的编译器可能以两种不同的方式解释同一条两个不同的编译器可能以两种不同的方式解释同一条#pragma指令指令指令指令一般用法一般用法一般用法一般用法:#pragma parameter注注注注:不同的不同的不同的不同的parameter参数语法和意义各不相同参数语法和意义各不相同参数语法和意义各不相同参数语法和意义各不相同嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#pragma message? message参数在大多数的编

38、译器中都有相似的实现参数在大多数的编译器中都有相似的实现参数在大多数的编译器中都有相似的实现参数在大多数的编译器中都有相似的实现? message参数在编译时输出消息到编译输出窗口中参数在编译时输出消息到编译输出窗口中参数在编译时输出消息到编译输出窗口中参数在编译时输出消息到编译输出窗口中? message可用于代码的版本控制可用于代码的版本控制可用于代码的版本控制可用于代码的版本控制注意注意注意注意message是是是是VC特有的编译特有的编译特有的编译特有的编译器指示字器指示字器指示字器指示字,GCC中将其忽略中将其忽略中将其忽略中将其忽略。嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨

39、询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116实例分析实例分析实例分析实例分析5-1#pragma在不同编在不同编在不同编在不同编译器下的使用示例译器下的使用示例译器下的使用示例译器下的使用示例嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#pragma pack?什么是内存对齐什么是内存对齐什么是内存对齐什么是内存对齐?不同类型的数据在内存

40、中按照一定的规则排列不同类型的数据在内存中按照一定的规则排列不同类型的数据在内存中按照一定的规则排列不同类型的数据在内存中按照一定的规则排列;而而而而不是顺序的一个接一个的排放不是顺序的一个接一个的排放不是顺序的一个接一个的排放不是顺序的一个接一个的排放,这就是对齐这就是对齐这就是对齐这就是对齐。两种类型所占的内存空间是否相同两种类型所占的内存空间是否相同两种类型所占的内存空间是否相同两种类型所占的内存空间是否相同?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群:

41、 65212116#pragma pack? 为什么需要内存对齐为什么需要内存对齐为什么需要内存对齐为什么需要内存对齐?? CPU对内存的读取不是连续的对内存的读取不是连续的对内存的读取不是连续的对内存的读取不是连续的,而是分成块读取的而是分成块读取的而是分成块读取的而是分成块读取的,块的大小只块的大小只块的大小只块的大小只能是能是能是能是1、2、4、8、16字节字节字节字节? 当读取操作的数据未对齐当读取操作的数据未对齐当读取操作的数据未对齐当读取操作的数据未对齐,则需要两次总线周期来访问内存则需要两次总线周期来访问内存则需要两次总线周期来访问内存则需要两次总线周期来访问内存,因因因因此性能

42、会大打折扣此性能会大打折扣此性能会大打折扣此性能会大打折扣? 某些硬件平台只能从规定的地址处取某些特定类型的数据某些硬件平台只能从规定的地址处取某些特定类型的数据某些硬件平台只能从规定的地址处取某些特定类型的数据某些硬件平台只能从规定的地址处取某些特定类型的数据,否则否则否则否则抛出硬件异常抛出硬件异常抛出硬件异常抛出硬件异常嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#pragma pack? #pragma pack能够改变编译器的默认对

43、齐方式能够改变编译器的默认对齐方式能够改变编译器的默认对齐方式能够改变编译器的默认对齐方式sizeof(struct Test1) = ?sizeof(struct Test2) = ?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#pragma pack? struct占用的内存大小占用的内存大小占用的内存大小占用的内存大小? 第一个成员起始于第一个成员起始于第一个成员起始于第一个成员起始于0偏移处偏移处偏移处偏移处? 每个成员按其类型大小和

44、指定对齐参数每个成员按其类型大小和指定对齐参数每个成员按其类型大小和指定对齐参数每个成员按其类型大小和指定对齐参数n中较小的一个进行对齐中较小的一个进行对齐中较小的一个进行对齐中较小的一个进行对齐 偏移地址和成员占用大小均需对齐偏移地址和成员占用大小均需对齐偏移地址和成员占用大小均需对齐偏移地址和成员占用大小均需对齐 结构体成员的对齐参数为其所有成员使用的对齐参数的最大值结构体成员的对齐参数为其所有成员使用的对齐参数的最大值结构体成员的对齐参数为其所有成员使用的对齐参数的最大值结构体成员的对齐参数为其所有成员使用的对齐参数的最大值? 结构体总长度必须为所有对齐参数的整数倍结构体总长度必须为所有

45、对齐参数的整数倍结构体总长度必须为所有对齐参数的整数倍结构体总长度必须为所有对齐参数的整数倍嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116实例分析实例分析实例分析实例分析5-2Intel和微软的面试题和微软的面试题和微软的面试题和微软的面试题结构体大小的计算结构体大小的计算结构体大小的计算结构体大小的计算嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流

46、学习交流学习交流学习交流QQ群群群群: 65212116课后思考课后思考课后思考课后思考?结构体变量是否可以直接用结构体变量是否可以直接用结构体变量是否可以直接用结构体变量是否可以直接用memcmp函数函数函数函数进行相等判断进行相等判断进行相等判断进行相等判断?为什么为什么为什么为什么?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents#pragma预处理分析预处理分析预处理分析预处理分析#和和和和#运算符使用解析运算符使用解析运

47、算符使用解析运算符使用解析嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#运算符运算符运算符运算符?#运算符用于在预编译期将宏参数转换为字符串运算符用于在预编译期将宏参数转换为字符串运算符用于在预编译期将宏参数转换为字符串运算符用于在预编译期将宏参数转换为字符串example6-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流Q

48、Q群群群群: 65212116实例分析实例分析实例分析实例分析6-1#运算符在宏中的妙用运算符在宏中的妙用运算符在宏中的妙用运算符在宏中的妙用嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116#运算符运算符运算符运算符?#运算符用于在预编译期粘连两个符号运算符用于在预编译期粘连两个符号运算符用于在预编译期粘连两个符号运算符用于在预编译期粘连两个符号example6-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116利用利用利用利用#定义结构类型定义结构类型定义结构类型定义结构类型实例分析实例分析实例分析实例分析6-2

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

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁