您的位置:首页 > 编程语言 > C语言/C++

C语言中常见的宏定义笔试/面试题

2015-03-08 20:12 316 查看
转载地址:http://blog.163.com/china_2008ay/blog/static/90142252200961971756712/

1,写宏定义:得到一个field在结构体(struct type)中的偏移量

#define OFFSETOF(type, field) ((size_t)&(((type *)0)->field))

解释:

(type *)0:把0地址当成type类型的指针。

((type *)0)->field:对应域的变量。

&((type *)0)->field:取该变量的地址,其实就等于该域相对于0地址的偏移量。

(size_t)&(((type *)0)->field):将该地址(偏移量)转化为size_t型数据。

ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((s*)0)的结果就是一个类型为s*的NULL指针。如果利用这个NULL指针来访问s的成员当然是非法的,但&(((s*)0)->m)的意图并非想存取s字段内容,而仅仅是计算当结构体实例的首址为((s*)0)时m字段的地址。聪明的编译器根本就不生成访问m的代码,而仅仅是根据s的内存布局和结构体实例首址在编译期计算这个(常量)地址,这样就完全避免了通过NULL指针访问内存的问题。

2,用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。

这个表达式中用到UL(表示无符号长整型),那么你就有了一个好的起点。记住,第一印象很重要。

答案:#define SECOND_PER_YEAR (60*60*24*365)UL (or Ul or uLor ul)

3,写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

懂得在宏中小心地把参数用括号括起来。号长整型)

#define MIN(A,B) ((A)<=(B)?(A):(B))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: