#define x do{......} while(0)的用处】的更多相关文章

比如定义宏,#define FREE1(p) if (p) free (p)然后这样调用:if (expression)FREE1(p);elseprintf(“expression was false.\n”) ; 展开:if (expression)if (p) free (p);elseprintf(“expression was false.\n”) ; 看看else和第二个if匹配了,错了吧,呵呵!-换成这样定义,#define FREE1(p) do{if (p) free (p);…
在linux内的信号处理函数中,有#define SIG_DFL ((void(*)(int))0)和#define SIG_IGN ((void(*)(int))1)两个宏定义.要理解这两个宏定义,我们先要知道signal函数的运行机制.首先我们看看该函数的原型声明,如下:void (*signal (int signr,void (*handler)(int))) (int) signal函数有两个参数,一个是指定需要捕获的信号signr:另外一个是新的信号处理函数指针void (*hand…
linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }while(0) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢? 实际上,do{...}while(0)的作用远大于美化你的代码.查了些资料,总结起来这样写主要有以下几点好处: 1.辅助定义复杂的宏,避免引用的时候出错: 举例来说,假设你需要定义这样一个宏: #define DOSOMETHING()\ foo1();\ foo2(); 这个宏的本意是,当调用DOS…
vs2010编译zapline-zapline.systemoptimization-8428e72c88e0.zip出错 1>d:\program files (x86)\microsoft visual studio 10.0\vc\include\intrin.h(141): error C2059: 语法错误:“(” 注释工程中的//#define abs(value) (value >= 0 ? value : -(value))即可…
<ol> <li>函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心.</li> <li>调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同.如果是真正的函数,那么它的函数体要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令.而如果是函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令.所以…
问题引出: 我们都知道宏定义#define只是简单替换,所以遇到复杂的带参数宏,必须很小心的为需要的参数加上括号“()”:同样碰到复杂的多条语句替代,虽然加{}可以将其封装成一个整体,但同时又有另一个问题:与语法习惯的冲突.比如: #include <stdio.h> void print_1(void){ printf("print_1\n");} void print_2(void){ printf("print_2\n");} #define  p…
where 1=1 where 1=1有什么用?在SQL语言中,写这么一句话就跟没写一样. select * from table1 where 1=1与select * from table1完全没有区别,甚至还有其他许多写法,1<>2,'a'='a','a'<>'b',其目的就只有一个,where的条件为永真,得到的结果就是未加约束条件的. 在SQL注入时会用到这个,例如select * from table1 where name='lala'给强行加上select * fr…
在学习第一门编程语言时,就已经介绍了顺序分支.条件分支.循环分支.比如循环分支有for.while.do-while语句.在随后的学校及工作中,如果手工循环一般使用for.while,很少使用do-while,感觉用处不大,但现在看来,do-while大有用途. 1. 帮助定义复杂的宏以避免错误 举例来说,假设你需要定义这样一个宏: #define DOSOMETHING() foo1(); foo2(); 这个宏的本意是,当调用DOSOMETHING()时,函数foo1()和foo2()都会被…
之前为了自己做一套SSH,先自己实现了一套telnet.但经过这么多天的苦逼,发现以前的工作都是徒劳.ssh的协议很繁杂,核心的内容在于密码算法,而且自己很难在网上找到周全的细节讲解与详细的实现,只有靠自己刷RFC和问大神还有就是靠强X我的服务器艰难地完成. 现计算了下时间,自己做SSH耗费了进两个月的时间,虽然期间也夹着其他的繁杂事物,但自己在这方面确是是耗费了非常大的精力.因为这方面详细资料的匮乏,自己以前也几乎没有接触过密码学方面的东西,很多只有靠自己摸索,所以我得经常拿我自己的服务器来做…
SSh协议: 全称为Secure Shell,即很安全的shell,主要目的是用来取代传统的telnet和r系列命令(rlogin,rsh,rexec等)远程登录和远程执行命令的工具,实现远程登录和远程执行命令加密,防止由于网络监听而出现的密码泄露,从而对系统构成威胁.(telnet协议采用明文传送密码,数据传送过程中也不加密) ssh协议目前有ssh1 和ssh2,其实现在我们主要使用的也是openssh.ssh不仅在登录过程中对密码进行加密传送,而且在登录后执行的命令的数据也进行加密,这样即…