C语言中常见的宏定义笔试/面试题
2015-03-08 20:12
363 查看
转载地址: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))
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))
相关文章推荐
- 常见C语言面试题之三:字符串替代
- 常见C语言面试题之五:两个字符串的最大公共子字符串
- 常见C语言面试题之一:字符串代替、字符串转换整数
- C语言笔试面试题收藏
- 常见算法笔试或面试题
- 常见C语言面试题之一:字符串代替、字符串转换整数
- Java常见笔试、面试题
- 嵌入式软件常见笔试面试题总结
- 嵌入式软件常见笔试面试题总结
- C/C++笔试、面试题目大汇总 Visual C++常见面试题 王牌7
- 常见C语言面试题之六:数组逆序
- 常见C语言面试题之十一:约瑟夫环
- 常见C语言面试题之十:有序表合并
- 常见算法笔试或面试题
- 常见算法笔试或面试题
- 常见C语言面试题之四:删除字符串头尾空格,字符串右对齐
- 常见C语言面试题之九:链表逆序
- c语言常见笔试题总结
- 企业面试题,笔试题 之C语言
- c语言常见笔试编程题strcpy和strstr