C语言琐碎记录之#define宏的用法【顺便提提 __FILE__,__LINE__的用法】
C语言的#define 简而言之 就是 替换你的代码为目标代码的。
最近我有在用,比如
#define PRINT_LINE(FP,MSG) fprintf(FP,"%s:%d %s\n",__FILE__,__LINE__,MSG)
#define free_safe(EXP) if((EXP)!=NULL && \
(unsigned int)(EXP)>(unsigned int)0x07000000 && \
(unsigned int)(EXP)<(unsigned int)0xffffffff ){\
free((EXP));\
}else{\
fprintf(stderr,"%s:%d:ERROR:%s=0x%08x cannot safe to free!!!!!!!\n",__FILE__,__LINE__,#EXP,(unsigned int)(EXP) );\
}
对于第一个 又涉及到了__FILE__ 和 __LINE__
对于第一个我很想做一个msg,...这样传递多参数,或可变参数的宏,但是自己不知如何搞定!现在知道了
对于第二个 功能是为了先判断,再安全free空间。而且还涉及到了一个技巧! #EXP将表达式 本身字符串打印出来!
第一个多参数宏:
#define PRINTF(out, ...) printf(out, ## __VA_ARGS__); fflush(stdout);
一个##__VA_ARGS__特殊的变量即可
而#EXP也算是一个特殊的变量。他们都是编译器的buildin支持的变量吧。。。
__FILE__,__LINE__也是编译器 所内置支持的变量。如同那个 什么__DEBUG__什么的 一样。
这个很方便,但是当函数传参的话,比较麻烦,希望能够用户不写__FILE,__LINE__也可以使用,所以使用#define伪函数是最好的方法!
------------------------------------------------------------------------------------------------
一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。