现在的位置: 首页 > 综合 > 正文

《程序员面试宝典》一些笔记(3)

2013年01月31日 ⁄ 综合 ⁄ 共 623字 ⁄ 字号 评论关闭

这一篇写一些与宏定义相关的一些小问题,关于#define宏定义的一些需要注意的问题:

  1. 宏定义是预处理指令,在预处理阶段,预处理期进行处理,只是简单的替换为定义内容;
  2. 预处理会自动计算常量表达式,例如 #define M 10*12
  3. #define不能以分号结尾,还要把参数小心的用括号括起来
下面有一写例子:
试题1 用一个宏定义FIND求一个结构体struc里某一个变量相对struc的偏移量,例如:
1  struct student
2  {
3      int a;
4      char b[20];
5      double c;
6  }

则:

FIND(student, a); // 等于0
FIND(student, b); // 等于4

解答:

#define FIND(struc, e) (size_t)&(((struc*)0)->e)

构造方法非常巧妙,(struc*)0 把常量0强制转换为struc类型的指针,所以结构体struc的地址从位置0开始;然后取变量e的地址&(((struc*)0)->e,就是变量e相对地址0的位移,然后强制转换为size_t类型,一般size_t为无符号型数据,一般为unsigned int。

试题2 用预处理指令#define声明一个常数,用以表示1年中有多少秒,忽略润年问题:
解答:
#define A_YEAR_SECONDS (365*24*60*60)UL

这里(365*24*60*60)会在预处理阶段自动计算出结果,需要注意的是后面使用UL表示无符号长整型,为了防止在16位机器上越界的问题

抱歉!评论已关闭.