目錄
預處理
1. 條件編譯
1.1 條件編譯如何使用?
1.1.2. #define #ifdef
1.1.3. #ifdef #else
多條件的情況
1.1.4. #ifdefined()
1.1.5. if defined()多條件判定
1.1.6. 條件編譯支持嵌套
1.1.7. #else defined()
1.2.1. 為何要有條件編譯?
1.2.2. 條件編譯都在哪些地方用?
2. 檔案包含
2.1.1 防止頭檔案重復包含兩種:
2.1.2用 “” 包含的頭檔案
2.2. #error 預處理
2.3. #line 預處理
2.4. #pragma
2.5. # 運算子
2.5.1. printf
2.5.2. #作用:
2.6. ## 預算符
2.6.1. ##含義
2.6.2. ##作用:
2.6.3. 怎么區分符號和字串?
本章節文章是作者通過觀看《C語言深度剖析》等各種資料總結的精華,基礎部分省略了不少,是為了讓大家能夠更加深入了解C語言的魅力!因為為了避免與之前的文章發生贅述,所以就直接講作者認為的精華部分哈!現在正文開始!
誰都不能阻擋你成為更優秀的人,
預處理
1. 條件編譯
1.1 條件編譯如何使用?
首先我們先來了解什么是宏定義,什么是宏真偽:
PS:一樣是非0為真,0為假,
1.1.2. #define #ifdef
例一:

例二:
PS:ifndef是相反的,就是沒有定義則運算式為真,
1.1.3. #ifdef #else
例一:
條件編譯:代碼裁剪的工具!
例二:

#if 檢測的不止是宏有沒有定義,而且要看宏的真偽,真才執行#if下面的運算式,

當然我們發現這個如果宏定義為慷訓報錯,沒有定義會走#else下面的運算式,
例三:


VS也可以在預處理時自己輸入:

多條件的情況

當然也可以不用 == 也可以用 > 和 <
1.1.4. #ifdefined()

if defined() 和 ifdef 是一樣的功能,判斷也是判斷宏有沒有被定義,
下面是模擬 ifndef,但都是#endif 結束,

1.1.5. if defined()多條件判定

當然也可以這樣:
1.1.6. 條件編譯支持嵌套
1.1.7. #else defined()
這就可以解決之前說的沒有 else if 情況了,
當然如果C CPP 都定義了,就只保留上面的(列印 hello C),
1.2.1. 為何要有條件編譯?
本質認識:條件編譯,其實就是編譯器根據實際情況,對代碼進行裁剪,而這里“實際情況”,取決于運行平臺,代碼本身的業務邏輯等,可以認為有兩個好處:1. 可以只保留當前最需要的代碼邏輯,其他去掉,可以減少生成的代碼大小2. 可以寫出跨平臺的代碼,讓一個具體的業務,在不同平臺編譯的時候,可以有同樣的表現
1.2.2. 條件編譯都在哪些地方用?
舉一個例子吧我們經常聽說過,某某版代碼是完全版/精簡版,某某版代碼是商用版/校園版,某某軟體是基礎版/擴展版等,其實這些軟體在公司內部都是專案,而專案本質是有多個源檔案構成的,所以,所謂的不同版本,本質其實就是功能的有無,在技術層面上,公司為了好維護,可以維護多種版本,當然,也可以使用條件編譯,你想用哪個版本,就使用哪種條件進行裁剪就行,著名的Linux內核,功能上,其實也是使用條件編譯進行功能裁剪的,來滿足不同平臺的軟體,
2. 檔案包含
2.1.1 防止頭檔案重復包含兩種:
一:#pragma once
二:

但是為什么寫頭檔案先寫這個呢?(如何做的,結果我們是知道的)
第一次 _TEST_H_ 沒有被定義,接著 #define 定義,然后后面再定義了,
ifndef 為假不執行,就不會重復定義了,
2.1.2用 “” 包含的頭檔案

用“ ” 是現在當前目錄檔案下查找頭檔案,找不到再去系統檔案目錄下查找頭檔案,
而用 <>是直接在系統檔案目錄下查找頭檔案,
PS:前面提到了頭檔案展開,那到底是什么意思呢?
我們發現我們原來的幾行代碼,但是看預處理有800多行,簡單理解就是把
頭檔案的內容拷貝到目標檔案(也有去注釋,條件編譯等),
2.2. #error 預處理
預處理都是在編譯期間起效果的,也就是和后面的鏈接,運行沒有關系,這點要注意 另外,很多預處理用的并不多,我們這里挑重要的說一下,

2.3. #line 預處理

2.4. #pragma


他們兩個的區別就是一個是提示級別的資訊,一個是報錯級別的資訊,
2.5. # 運算子

相鄰字串具有自動聯接特性,
2.5.1. printf

注意printf第一個引數就是char*,所以可以直接printf(str),至于后面的 ... 是可變引數串列,后面講,

將引數符號s對應的文本內容,轉換為對應的字串,
這里就是一開始s為3.1415926然后轉換為#3.1415926然后把3.1415926轉換為字串,再列印出來了,
下面是linux里面的,大家可以看右邊是預處理之后的結果,

2.5.2. #作用:

我們現在就可以直接把數字12345直接通過我們定義的 TOSTRING 直接轉換為字串!列印出來的就是12345字串,
這就比我們之前計算而來的方法要便捷得多!
但是!

這樣是不可以的,因為宏是預處理的程序,而開辟空間也是最少到匯編了,所以先一步直接把abc轉換為了字串,列印出來的就是abc,
所以我們要用的話直接寫要轉的目標就可以了,
2.6. ## 預算符
2.6.1. ##含義
簡單說就是把##兩邊的符號連接起來形成新的符號(如student1就是一個新的符號),

2.6.2. ##作用:
就比如說我們要列印一個科學記數法的數我們知道底數和他的次方數,就可以用##定義一個新的符號,值得注意的是 ##中寫的e ,在編譯程序中是有效的!

例如:
我們來看看linux預處理后的代碼(右邊)


2.6.3. 怎么區分符號和字串?
其實只要記住字串是用“”引起的,對于字符像我們寫的char* str=“abcd”的str,int a的a,還有我們上面的12345轉字串的12345都是符號!還有字串是程式內部的內容,編譯器不會動他,而符號是可被編譯器進行改變的(改為編譯器所理解的),
今天的內容就到這里了哈!!!
要是認為作者有一點幫助你的話!
就來一個點贊加關注吧!!!當然訂閱是更是求之不得!
最后的最后謝謝大家的觀看!!!
你們的支持是作者寫作的最大動力!!!
下期見哈!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384338.html
標籤:其他
上一篇:jmeter--基礎實戰應用總結
