#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; }
答案:spa
var1 = var2/nvar2 = var1/ncode
解析:blog
#爲字符串化操做符,將所鏈接的部分轉化爲一個字符串,##爲字符串鏈接符,將兩個字符串鏈接成一個字符串,均在預處理時完成字符串的替換。字符串
#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; }
答案:string
12
f(1,2)io
解析:class
本題考察字符串化操做符#得做用得執行過程,以及宏定義替換的次序。若是該宏爲帶#號的宏定義,則直接替換字符串,無需再嵌套替換,若是該宏不是帶#的宏,則先替換括號內部的宏定義,而後替換外部的。變量
答案:ember
#define OFFSET(struct, member) ((unsigned int)&((struct *)0)->member)di