您的位置:首页 > 其它

UBUNTU开启SSH服务

2011-05-06 13:21 309 查看
使用宏是提高程序效率的好办法,但是经常因为设计不严谨不周全而造成一些奇怪的问题。经常读到一些经典的宏的写法,记录之。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: