Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266158
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 246
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-03 18:23
个人简介

qrasvasdf

文章分类

全部博文(99)

文章存档

2016年(1)

2015年(36)

2014年(62)

我的朋友

分类: LINUX

2015-02-27 13:58:47

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 */
 
 
 
阅读(878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~