DEBUG宏

4.8.6.运算中的临时匿名变量
4.8.6.一、C语言和汇编的区别(汇编彻底对应机器操做,C对应逻辑操做)
(1)C语言叫高级语言,汇编语言叫低级语言。
(2)低级语言的意思是汇编语言和机器操做相对应,汇编语言只是CPU的机器码的助记符,用汇编语言写程序必须拥有机器的思惟。由于不一样的CPU设计时指令集差别很大,所以用汇编编程的差别很大。
(3)高级语言(C语言)它对低级语言进行了封装(C语言的编译器来完成),给程序员提供了一个靠近人类思惟的一些语法特征,人类不用过于考虑机器原理,而能够按照本身的逻辑原理来编程。譬如数组、结构体、指针····
(4)更高级的语言如java、C#等只是进一步强化了C语言提供的人性化的操做界面语法,在易用性上、安全性上进行了提高。java

4.8.6.二、C语言的一些“小动做”
(1)高级语言中有一些元素是机器中没有的
(2)高级语言在运算中容许咱们大跨度的运算。意思就是低级语言中须要好几步才能完成的一个运算,在高级语言中只要一步便可完成。譬如C语言中一个变量i要加1,在C中只须要i++便可,看起来只有一句代码。但实际上翻译到汇编阶段须要3步才能完成:第1步从内存中读取i到寄存器,第2步对寄存器中的i进行加1,第3步将加1后的i写回内存中的i。程序员

4.8.6.三、使用临时变量来理解强制类型转换编程

4.8.6.四、使用临时变量来理解不一样数据类型之间的运算数组


4.8.7.顺序结构
4.8.7.一、最浅显的顺序结构:三种结构之一
(1)代码执行的时候若是没有遇到判断跳转或者循环,默认是顺序执行的。执行完上一句则开始执行下一句。
(2)顺序结构说明CPU的工做状态,就是以时间轴来顺序执行全部的代码语句直到停机。安全

4.8.7.二、选择和循环结构内部的顺序结构
(1)譬如if(){}在{}内部是if的代码段,在代码段内部仍是按照顺序结构来执行的。
(2)switch case内部也同样,也是按照顺序结构执行的。
(3)while for内部也是按照顺序结构来执行的。函数

4.8.7.三、编译过程当中的顺序结构
(1)一个C程序有多个.c文件组成,编译的时候多个.c文件是独立分开编译的。每一个c文件编译的时候,编译器是按照从前到后的顺序逐行进行编译的。
(2)编译器编程时的顺序编译会致使函数/变量必须先定义/声明才能调用,这也是C语言中函数/变量声明的来源。
(3)连接过程当中呢?应该说连接过程连接器其实是在连接脚本指导下完成的。因此连接时的.o文件的顺序是由连接脚本指定的。若是连接脚本中明确指定了顺序则会优先考虑这个规则按照这个指定的顺序排布,若是连接脚本中没有指定具体的顺序则连接器会自动的排布。翻译

4.8.7.四、思考:为何本质都是顺序结构?
(1)顺序结构本质上符号CPU的设计原理,CPU又是人设计的,因此CPU的设计符合人的思考原理debug

debug宏的实现原理设计

(1)DEBUG宏大概的原理是:
#ifdef DEBUG
#define dbg() printf()
#else
#define dbg()
#endif
(2)工做方式是:若是咱们要输出DEBUG版本则在条件编译语句前加上#define DEBUG便可,这样程序中的调试语句dbg()就会被替换成printf从而输出;若是咱们要输出RELEASE版本则去掉#define DEBUG,则dbg()就会被替换成空,则程序中全部的dbg()语句直接蒸发了,这样的程序编译时就会生成没有任何调试信息的代码。指针

分析几个DEBUG宏
(1)应用程序中DEBUG宏
#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif

注:__FILE__等是C语言中的预约义宏,就是说这个东西是个宏定义,可是是C语言本身定义的。这些宏具备特殊的含义,譬如__FILE__表示当前正在编译的c文件的文件名。

(2)内核中的DEBUG宏
#ifdef DEBUG_S3C_MEM
#define DEBUG(fmt, args...) printk(fmt, ##args)
#else
#define DEBUG(fmt, args...) do {} while (0)
#endif

 

相关文章
相关标签/搜索