宏定義和預編譯 面試題總結

本輯內容來自各種網絡,書籍或其他資料的知識自我總結,持續更新中...

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的偏移量


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章