设为首页 加入收藏

TOP

C宏定义的小结(十二)
2013-01-01 14:59:11 来源: 作者: 【 】 浏览:3426
Tags:定义 小结

 

  当宏参数是另一个宏的时候

  需要注意的是凡宏定义里有用"#"或"##"的地方宏参数是不会再展开。

  #define A          (2)

  #define STR(s)     #s

  #define CONS(a,b)  int(a##e##b)

  printf("%s/n", CONS(A, A));               // compile error

  这一行则是:

  printf("%s/n", int(AeA));

  INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单。 加多一层中间转换宏。

  加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数

  #define STR(s)      _STR(s)          // 转换宏

  #define CONS(a,b)   _CONS(a,b)       // 转换宏

  printf("int max: %s/n", STR(INT_MAX));          // INT_MAX,int型的最大值,为一个变量 #include<climits>

  输出为: int max: 0x7fffffff

  STR(INT_MAX) -->  _STR(0x7fffffff) 然后再转换成字符串;

  printf("%d/n", CONS(A, A));

  输出为:200

  CONS(A, A)  -->  _CONS((2), (2))  --> int((2)e(2))

  "#"和"##"的一些应用特例

  1、合并匿名变量名

  #define  ___ANONYMOUS1(type, var, line)  type  var##line

  #define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line)

  #define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__)

  例:ANONYMOUS(static int);  即: static int _anonymous70;  70表示该行行号;

  第一层:ANONYMOUS(static int);  -->  __ANONYMOUS0(static int, __LINE__);

  第二层:                        -->  ___ANONYMOUS1(static int, _anonymous, 70);

  第三层:                        -->  static int  _anonymous70;

  即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;

  2、填充结构

  #define  FILL(a)   {a, #a}

  enum IDD{OPEN, CLOSE};

  typedef struct MSG{

  IDD id;

  const char * msg;

  }MSG;

  MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};

  相当于:

  MSG _msg[] = {{OPEN, "OPEN"},

  {CLOSE, "CLOSE"}};

  3、记录文件名

  #define  _GET_FILE_NAME(f)   #f

  #define  GET_FILE_NAME(f)    _GET_FILE_NAME(f)

  static char  FILE_NAME[] = GET_FILE_NAME(__FILE__);

  4、得到一个数值类型所对应的字符串缓冲大小

  #define  _TYPE_BUF_SIZE(type)  sizeof #type

  #define  TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type)

  char  buf[TYPE_BUF_SIZE(INT_MAX)];

  -->  char  buf[_TYPE_BUF_SIZE(0x7fffffff)];

  -->  char  buf[sizeof "0x7fffffff"];

  这里相当于:

  char  buf[11];

  ==========================================

  C宏定义的技巧总结

  1,防止一个头文件被重复包含

  #ifndef COMDEF_H

  #define COMDEF_H

  //头文件内容

  #endif

  2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

  typedef unsigned char      boolean;     /* Boolean value type. */

  typedef unsigned long int uint32;      /* Unsigned 32 bit value */

  typedef unsigned short     uint16;      /* Unsigned 16 bit value */

  typedef unsigned char      uint8;       /* Unsigned 8 bit value */

  typedef signed long int    int32;       /* Signed 32 bit value */

  typedef signed short       int16;       /* Signed 16 bit value */

  typedef signed char        int8;        /* Signed 8 bit value */

  //下面的不建议使用

  typedef unsigned char     byte;         /* Unsigned 8 bit value type. */

  typedef unsigned short    word;         /* Unsinged 16 bit value type. */

  typedef unsigned long     dword;        /* Unsigned 32 bit value type. */

  typedef unsigned char     uint1;        /* Unsigned 8 bit value type. */

  typedef unsigned short    uint2;        /* Unsigned 16 bit value type. */

  typedef unsigned long     uint4;        /* Unsigned 32 bit value type. */

  typedef signed char       int1;         /* Signed 8 bit value type. */

  typedef signed short      int2;         /* Signed 16 bit value type. */

  typedef long int          int4;         /* Signed 32 bit value type. */

  typedef signed long       sint31;       /* Signed 32 bit value */

  typedef signed short      sint15;       /* Signed 16 bit value */

  typedef signed char       sint7;        /* Signed 8 bit value */

  3,得到指定地址上的一个字节或字

  #define MEM_B( x ) ( *( (byte *) (x) ) )

  #define MEM_W( x ) ( *( (word *) (x) ) )

  4,求最大值和最小值

  #define MAX( x, y ) ( ((x) > (y)) (x) : (y) )

  #define MIN( x, y ) ( ((x) < (y)) (x) : (y) )

  5,得到一个field在结构体(struct)中的偏移量

  #define FPOS( type, field ) /

  /*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

  6,得到一个结构体中field所占用的字节数

  #define FSIZ( type, field ) sizeof( ((type *) 0)->field )

        

首页 上一页 9 10 11 12 13 14 下一页 尾页 12/14/14
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言变长数组 下一篇C语言基础之细节

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: