C語言宏的妙用(前處理器)

2020-08-12 18:48:35

所有預處理指令都以符號#開頭。此外,每個預處理指令必須單獨佔用一行。

1.#define

指令#define定義了一個識別符號及一個字元序列(即字元集合)。在源程式中每次遇到該識別符號時,就用定義的字元序列替換它。識別符號被稱爲宏名,替換過程稱爲宏替換。例如:

#define datou_shuai 1
#define datou_bushuai 2

注意與const常變數替換作用的場景區分開

const int datou_shuai = 1在編譯時起作用
#define datou_shuai 1在預編譯時起作用
const 型別爲浮點數時則是要從記憶體讀數據

注意,該語句沒有分號。在識別符號和字元序列之間可以有任意個空格,但是一旦字元序列開始,就只能由一新行結束。
在这里插入图片描述

定義類似函數的宏

#include<stdio.h>
#define SUM(x,y) (x*y)
int main()
{
	int a = 5, b = 4;
	int sum = SUM(a+5, b+6);
	printf("%d \n", sum);
}
//計算時應該爲a+5*b+6,即5+5*4+6=31

宏和函數的區別

1.宏在預編譯時進行替換,函數編譯和鏈接時形成程式碼
2.宏不存在現場的保護和恢復,函數要進行現場保護和恢復
3.使用時宏有副作用,可能會參數值
4.宏和型別無關,函數和型別有關

在这里插入图片描述

2.#include

指令#include告訴編譯器除了讀包含#include的一個原始檔外還要讀取另一個原始檔,被讀入的原始檔必須用雙引號或尖括號括起來。
檔名是用引號還足用尖括號括起來決定了指定檔案的查詢方法。如果檔名用尖括號括起來,則檔案以編譯器的建立者定義的方式進行在找,通常,這意味着從爲「包含檔案」設定的一些特殊目錄中查
找。如果檔名用引號括起來,則檔案以其他實現所定義的方式進行查詢。對許多編譯器來說,這意味着查詢當前工作目錄。如果未找到,則按檔名括在尖括號中的方式繼續查詢。
通常,許多程式設計師使用尖括號來包含標準標頭檔案,引號的使用則是爲了包含與程式關聯的檔案, 但這兩種用法沒有硬性的規定。

include的本質是將".h"中的內容拷貝到「.cpp」中。從而生成「.i」檔案。
注:數組裏使用 #include 時,#include要從寫,且屁股後不可加內容,數位要用逗號隔開,而字串每行都要用雙引號引起來。例:

//主函數
	int ar[] = { 
#include"hyh.txt"   //hyh.txt內容 12 ,23, 34, 45, 56, 67 ,78, 89 ,100
	};
	char br[] = {
#include"nrj.txt"
    };
//niu.txt內容
"You are a dog\n"
"I an a man"

該方法也可以初始化過長的字串。

最後插入個結構體大小計算圖
在这里插入图片描述
用#define計算結構體大小
在这里插入图片描述
關於#ifndef的解釋,預編譯起作用。
在这里插入图片描述