UBUNTU开启SSH服务
2011-05-06 13:21
309 查看
使用宏是提高程序效率的好办法,但是经常因为设计不严谨不周全而造成一些奇怪的问题。经常读到一些经典的宏的写法,记录之。
1,assert(e); e为真正常运行,否则输出LOG信息。
版本1:
版本2:有人认为,if(!e){} 加上大括号不就行了嘛,试试喽,你看
if (x>0 && y>0)
{ if(x>y){ _assert_error(__FILE__, __LINE__);};};
esle
{ if(y>x){ _assert_error(__FILE__, __LINE__);};} ;
最后一个分号是调用宏的时候添加的。当然,不添加这个分号程序就对了,但是我们不能这么写啊
版本3:看大牛的做法
如果e为真,那么_assert_error()就不会被执行到而返回,否则程序便开始断言错误。
2,求strcut成员的位移 例如
typedef struct
{
char a;
int b;
}A;
注意,我们要在编译阶段取b的位移。
计算得到member在type中的偏移量。
这里用size_t的定义是unsigned int,A中a的偏移是0,b的偏移就是4。
这里有一个疑问:如果在定义struct的时候指定了成员所占的位数,例如a:32, b:8,那么用上述宏定义的时候就会报错。
为啥?谁告诉我
[/code]
3,不是什么经典的宏,这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“
将本来是参数为结构体的myfunc()函数的调用使用成了不定参数。看看下边的展开形式就理解了。
出处:/article/2551955.html
本文出自 “风码牛不相及” 博客,请务必保留此出处http://wilburwoo.blog.51cto.com/3256629/607275
1,assert(e); e为真正常运行,否则输出LOG信息。
版本1:
#define assert(e) if(!e) {_assert_error(__FILE__, __LINE__)} 如果程序员这样使用,那就废了: if (x>0 && y>0) assert(x>y); esle assert(y>x) 展开看看吧,意思完全变了。 [code]if (x>0 && y>0) if(x>y){ _assert_error(__FILE__, __LINE__); } ; esle if(y>x){ _assert_error(__FILE__, __LINE__); } ;
版本2:有人认为,if(!e){} 加上大括号不就行了嘛,试试喽,你看
if (x>0 && y>0)
{ if(x>y){ _assert_error(__FILE__, __LINE__);};};
esle
{ if(y>x){ _assert_error(__FILE__, __LINE__);};} ;
最后一个分号是调用宏的时候添加的。当然,不添加这个分号程序就对了,但是我们不能这么写啊
版本3:看大牛的做法
#define assert(e) \ ((void)((e)||_assert_error(__FILE__,__LINE__)))
如果e为真,那么_assert_error()就不会被执行到而返回,否则程序便开始断言错误。
2,求strcut成员的位移 例如
typedef struct
{
char a;
int b;
}A;
注意,我们要在编译阶段取b的位移。
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
计算得到member在type中的偏移量。
这里用size_t的定义是unsigned int,A中a的偏移是0,b的偏移就是4。
这里有一个疑问:如果在定义struct的时候指定了成员所占的位数,例如a:32, b:8,那么用上述宏定义的时候就会报错。
为啥?谁告诉我
[/code]
3,不是什么经典的宏,这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“
__VA_ARGS__。
摘自陈大侠的酷壳.
#include <stdio.h> #define func(...) myfunc((struct mystru){__VA_ARGS__}) struct mystru { const char *name; int number; }; void myfunc(struct mystru ms ) { printf("%s: %d/n", ms.name ?: "untitled", ms.number); } int main(int argc, char **argv) { func("three", 3); func("hello"); func(.name = "zero"); func(.number = argc, .name = "argc",); func(.number = 42); return 0; }
将本来是参数为结构体的myfunc()函数的调用使用成了不定参数。看看下边的展开形式就理解了。
myfunc((struct mystru){"three", 3}); myfunc((struct mystru){"hello"}); myfunc((struct mystru){.name = "zero"}); myfunc((struct mystru){.number = argc, .name = "argc",}); myfunc((struct mystru){.number = 42});
出处:/article/2551955.html
本文出自 “风码牛不相及” 博客,请务必保留此出处http://wilburwoo.blog.51cto.com/3256629/607275
相关文章推荐
- ubuntu开启SSH服务
- ubuntu开启SSH服务
- ubuntu开启SSH服务
- ubuntu开启ssh服务
- Ubuntu ssh 服务开启方法
- Ubuntu 开启FTP和SSH服务
- ubuntu开启ssh服务
- ubuntu上开启SSH服务
- [ubuntu 12] 开启ssh服务、ftp服务 2015年总结
- ubuntu开启SSH服务
- ubuntu开启SSH服务
- Ubuntu开启ssh服务
- ubuntu开启ssh服务
- ubuntu 开启ssh服务
- Ubuntu 16.04开启SSH服务
- ubuntu开启SSH服务
- UBuntu开启SSH服务(转载)
- Ubuntu14.04开启ssh服务
- Ubuntu开启ssh服务(14.04)
- Ubuntu开启ssh服务