本輯內容來自各種網絡,書籍或其他資料的知識自我總結,持續更新中...
1,求運行結果
#include <stdio.h>
#include <string.h> //使用strcpy函數必須包含進該庫文件
#define STRCPY(a, b) strcpy(a##_p, #b)/*#爲字符串化操作符,將後面所連接部分轉化爲字符串;##爲字符串連接符,將兩個字符串連接成一個字符串,如將a和_p連接成a_p*/
int main()
{
char var1_p[20]; //定義數組存儲字符串
char var2_p[30];
strcpy(var1_p, "aaaa"); //把字符串複製到數組首元素首地址,相當初始化數組
strcpy(var2_p, "bbbb");
STRCPY(var1, var2); //編譯期代替成strcpy(var1_p,'var2'),將var2字符串複製/存儲到var1_p數組中,覆蓋了'aaaa'
STRCPY(var2, var1);
printf("var1 = %s/n", var1_p);//這裏有陷阱,'/n'不是換行符而是字符串,換行符是'\n'。打印var1_p數組的內容
printf("var2 = %s/n", var2_p);
return 0;
}
第3行宏定義後面不能有註釋,會被編譯器認爲屬於宏定義的一部分,如圖:
所以宏定義後面一定要保證只有標識符替代列表。
運行結果:
2,求運行後結果
#include <stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%sn", h(f(1,2)));
printf("%sn", g(f(1,2)));
return 0;
}
宏定義替代次序:
1,需替代字符串含 ' # ',直接替換字符串
如g(f(1,2)),直接替換成#f(1,2),即字符串f(1,2)
2,替代字符串不含 ' # ',先替代括號內部的宏定義,再替換外部的。
如h(f(1,2))替換成h(1##2),再替換成g(1##2),最後替換成#(1##2),即爲字符串"12"
3,定義一個宏,求一個結構體struct中某個變量相對於struct的偏移量