Chinaunix首页 | 论坛 | 博客
  • 博客访问: 451216
  • 博文数量: 42
  • 博客积分: 1325
  • 博客等级: 中尉
  • 技术积分: 1312
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-13 18:00
个人简介

呵~~~呵~~~

文章分类

全部博文(42)

文章存档

2016年(3)

2015年(1)

2014年(2)

2013年(2)

2012年(7)

2011年(11)

2010年(3)

2009年(13)

我的朋友

分类: LINUX

2011-12-15 14:38:20

GNU C常用扩展:typeof及语句表达式 及 例程。
 
一、typeof,扩展关键字 
  1. int a = 1;
  2. typeof(a) b = 2;
  1. #define SWAP(a, b) \
  2.     typeof(a) _tmp = a; \
  3.     a = b; \
  4.     b = _tmp;
 
二、语句表达式
    用 ({ ... }) 包括起来的就是“语句表达式”。  { ... } 表示一个“语句块”,加上 () 括起来表示“语句表达式”。
  “语句表达式”同“语句块”相同,可以使用循环、判断、局部变量。
   不同点在于:“语句表达式”有值。类似于“逗号表达式”,整个表达式的值 = 最后一个语句的值。
  1. int d = ({int x = 10; int y = 20; x > y ? x : y;});
  2. /* result: d = 20 */
 
三、例子,一个带返回值的宏。
以下这个宏的作用是:根据结构成员指针,返回结构体本身的指针。
  1. //_ptr  : 指向结构体成员的指针
  2. //_stru : 结构体
  3. //_nofs : 结构体成员名

  4. #define GET_STRUCT(_ptr, _stru, _nofs) \
  5.     ({(_stru *)( (unsigned char *)_ptr - (unsigned int)(&((_stru *)0)->_nofs));})
使用例子
  1. struct STU
  2. {
  3.     int i;
  4.     char a[24];
  5. };
  6. ...
  7. ...
  8. struct STU s = {10, "aaa"};
  9. int *p = &s.i;
  10. struct STU *off = GET_STRUCT(p, struct STU, i);
  11. printf("%s\n", off->a);

  12. /* result: aaa */
 
 
 
阅读(2387) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~