天天看點

預編譯指令#define、#include、标準頭檔案結構小析1. #define編譯預處理指令2. 一個.c檔案是一個編譯單元3. 項目:4. #include

1. #define編譯預處理指令

a. #define <名字> <值>
	b. 沒有結尾的分号,因為不是C的語句
	c. 名字必須要有一個是單詞,值可以是各種東西
	d. C語言中的編譯器開始之前,編譯預處理程式會把程式中的名字改為值(宏展開)
		i. 完全的文本替換
	e. 宏
		i. 如果一個宏的值裡面有其他的宏的名字,也是會宏展開的
		ii. 如果一個宏的值超過一行,最後一行之前的行末要加反斜杠\
	f. 沒有值的宏
		i. #define _DEBUG
		ii. 這類宏是用于條件編譯的,後面有其他的編譯預處理指令來檢查這個宏是否已經被定義過
	g. 預定義的宏
		i. 這些宏在C程式中,不需要再進行定義,可以直接使用
		ii. _STDC_、_LINE_、_FILE_、_DATE_、_TIME_
	h. 帶參數的宏(像函數)
		i. #define cube(x) ((x)*(x)*(x))
		ii. 在C語言中,用綠色部分替換黃色部分
		iii. 注意:為避免計算錯誤,需要将綠色部分用大括号括起來
			1) 參數出現的地方需要括号
			2) 整個值也需要括号
		iv. 帶多個參數的宏
			1)  #define  MIN(a,b)  ((a)>(b)?(b):(a))
           

2. 一個.c檔案是一個編譯單元

a. 編譯器每次編譯隻處理一個編譯單元--->生成.o檔案
	b. 很多個.c檔案都被編譯完成之後,由LINK将.o檔案連結成一個可執行檔案.exe
           

3. 項目:

a. Dev C++中建立一個項目,然後把幾個源代碼檔案添加進入即可
	b. 對于項目。Dev C++的編譯會把一個項目中所有的源代碼檔案都編譯然後連結
	c. 對于VS, 是編譯按鈕隻進行編譯。然後build進行建構對整個項目做連結
           

4. #include

a. #include是一個編譯預處理指令,和宏一樣,在編譯之前就預處理了
	b. 功能是把那個檔案的全部内容原封不動地插入到他所在的地方
	c. 是以并不是所有的.c檔案都需要#include
	d. #include有兩種形式指出要插入的.h頭檔案
		i. “”---表示要求編譯器首先在目前目錄尋找.h檔案;如果沒有那麼到編譯器指定的目錄去尋找
		ii. < >---表示要求編譯器直接到編譯器指定的目錄尋找.h頭檔案
		iii. #include并不是用來引入函數庫的,引入函數庫的工作是編譯器幹的;是以#include引入.h檔案主要是用于引入所需要的函數的原型
		iv. 庫函數的原碼在.lib檔案中
	e. 頭檔案
		i. 在使用和定義這個函數的地方都應該#include這個頭檔案
		ii. 這個頭檔案一般存放所有的對外公開的函數的原型和外部連結的靜态變量
	f. 重複聲明
		i. 在同一個編譯單元裡,同名的結構不可以被重複聲明
		ii. 如果在頭檔案裡面有結構的聲明,那麼很難這個頭檔案不會在一個編譯單元裡被#include多次
		iii. 是以需要“标準頭檔案結構”來避免重複聲明結構
			1) 标準頭檔案
			2) 如下圖所示 
			3) 其中的意思就是,先判斷如果_LIST_HEAD_未定義,那麼進行定義;否則直接跳過
			4) 運用了條件編譯和宏,保證這個頭檔案在一個編譯單元中隻會被#include一次
			5) #pragma once也能起到相同的作用,但不是所有的編譯器都會支援
           
預編譯指令#define、#include、标準頭檔案結構小析1. #define編譯預處理指令2. 一個.c檔案是一個編譯單元3. 項目:4. #include

繼續閱讀