易出错的C语言题目之一:宏定义与预处理
1、写出下列代码的运行结果:
#include<stdio.h> #include<string.h> #define STRCPY(a,b) strcpy(a##_p,#b) int main(){ char var1_p[20]; char var2_p[30]; strcpy(var1_p,"aaaa"); strcpy(var2_p,"bbbb"); STRCPY(var1,var2); STRCPY(var2,var1); printf("var1 = %s/n",var1_p); printf("var2 = %s/n",var2_p); printf("\n"); return 0; }
答案:
var1 = var2/nvar2 = var1/n
解析:
#为字符串化操作符,将所连接的部分转化为一个字符串,##为字符串连接符,将两个字符串连接成一个字符串,均在预处理时完成字符串的替换。
2、写出下列代码的运行结果:
#include<stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main(){ printf("%s\n",h(f(1,2))); printf("%s\n",g(f(1,2))); return 0; }
答案:
12
f(1,2)
解析:
本题考察字符串化操作符#得作用得执行过程,以及宏定义替换的次序。如果该宏为带#号的宏定义,则直接替换字符串,无需再嵌套替换,如果该宏不是带#的宏,则先替换括号内部的宏定义,然后替换外部的。
3、定义一个宏,求一个结构体struct中某个变量相对于struct的偏移量
答案:
#define OFFSET(struct, member) ((unsigned int)&((struct *)0)->member)