亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言中如何去理解預處理階段

2019-11-10 16:56:21
字體:
來源:轉載
供稿:網友

C語言如何去理解預處理階段

預處理

宏定義( 無參宏定義,帶參宏定義)

條件編譯

文件包含

預處理操作符號和預定義宏

下面將會依次的去介紹各個階段中的一些細節性東西

預處理

首先在C語言編譯的時候,會經歷以下幾個步驟:預處理,編譯,匯編,鏈接,然后生成可執行文件。整個過程是一連串動作完成的。而預處理階段呢,也是在最先執行的一個步驟。相對來說,也是比較重要的一個步驟。

概念: 以“#”號開頭的預處理指令如包含#include,宏定義制定#define等,在源程序中這些指令都放在函數之外,而且一般放在源文件的前面 ,所謂預處理其實就是在編譯的第一遍掃描之前的所作的工作,預處理是C語言的一個重要的功能,它由預處理程序單獨完成,當對一個源文件進行編譯時,系統自動引用預處理程序,預處理在 源代碼編譯之前對其進行的一些文本性質的操作,對源程序編譯之前做一些處理,生成擴展的C源程序

預處理階段做了任務: 1:將頭文件中的內容(源文件之外的文件)插入到源文件中 2:進行了宏替換的過程,定義和替換了由#define指令定義的符號 3:刪除掉注釋的過程,注釋是不會帶入到編譯階段 4:條件編譯

預處理指令:

gcc -E bin/helloworld.i src/helloworld.c預處理生成的是.i的文本文件,這個文本文件是可以直接通過cat命令進行文本文件查看的

宏定義

在C語言中允許用一個標識符來表示一個字符串;稱為宏,在預處理時,對程序的宏進行替換,其中宏定義是由源程序中的#define來完成 ,而宏的替換,主要是由預處理程序完成的

#define PI 3.1415

宏定義的規則:

#表示一條預處理的指令,以#開頭的均是預處理指令#define是宏定義的指令,標識符是所定義的宏名宏名一般都是大寫的字母表示,以便和變量名區別宏定義其實并不是C語言的語句,所以后面是不用去加;號宏體可以是常數,表達式,格式化字符串等,為表達式的時候應該用括號闊起來宏替換不分配內存空間,也不做正確性的檢查宏的范圍是從定義后到本源文件的結束,但是可以通過#undef來進行提前取消

宏定義分為有參宏定義和無參宏定義: 無參宏定義:

語法: #define 標識符(宏名)[字符串] 宏體可缺?。? #define YES 1 #define NO 0 #define OUT 帶參宏定義:

帶參宏定義的語法結構 #define 宏名(形參列表) 字符串(宏體) 帶參數宏定義調用: 宏名(實參表); C語言中允許宏帶有參數,在宏定義的參數中稱為形式參數,形式參數不分配內存單元,沒有類型定義; #define S(a,b) a*b; area = S(3,2); 宏展開 area = 3 * 2; 注意事項: 帶參數宏定義中,宏名和形式參數列表之間不能有空格出現。如 #define MAX (a,b) (a>b)?a:b 此時MAX為無參的宏定義,宏體為(a,b) (a>b)?a:b #define MAX(a,b) (a>b)?a:b 宏定義中,形參是一個標識符,而宏調用的參數可以是一個表達式 宏體內的形參通常要括號闊起來 #define POWER(x) ((x)*(x))

從帶參數的宏定義中我們可以發現,其在很多場合下,是可以看作是一個函數來使用的,但是與真正的函數又是有著很大的區別的,所以以下是總結出來的函數與宏之間的幾點區別: 區別: 區別

對比項 帶參數宏定義 函數
處理時間 編譯時期 程序運行時期
參數類型 無參數類型 有具體的參數類型
處理過程 不分配內存,簡單字符的置換 分配內存,先求得實參,再傳遞給形參
程序長度 會變長 不變
運行速度 不會占用運行時間 調用和返回會占用時間
支持遞歸 宏定義是不會支持遞歸的 函數支持遞歸

條件編譯

條件編譯的概念 1:一般情況下,源程序中所有的行都進行編譯,但是有時希望對其中一部分內容滿足一定條件下才進行編譯,也就是對一部分內容指定編譯條件,這就是條件編譯

條件編譯的優點 條件編譯可以指定代碼的一部分是被正常編譯還是被完全忽略 條件編譯有利于提升程序的可移植性,增強程序 的靈活性

條件編譯的相關語法 條件編譯語法一:

#ifdef 標識符(宏名) //或者#if define(標識符) 程序段1 #else 程序段2 #endif實例代碼:防止多重包含的問題產生#define HELLO "helloworld"#ifdef HELLO #define HI "welcome"#endif

條件編譯語法二:

#ifndef 標識符(宏名) //或#if !define(標識符) 程序段1 #else 程序段2 #endif 實例: #ifndef __HELLO_H__ #define __HELLO_H__ void out(); #else //程序段2 #endif

條件編譯語法三:

#if(常量表達式) 程序段1 #elif(常量表達式2) 程序段2 #else 程序段3 #endif實例代碼: #define C1 0 #define C2 0 #define C3 1 #if(C1) #include "c1.h" #elif(C2) #include "c2.h" #elif(C3) #include "c3.h" #else #include "c.h" #endif

文件包含

文件包含的概念 文件包含是C預處理程序的另一個重要的功能,被包含的文件名字必須使用雙引號”“(自定義頭文件),或者<>(標準庫文件)括起來,

文件包含的語法:

#include <文件名>或者#include "文件名"

文件包含的功能: 一個源文件可以將另外一個源文件的內容包含進來,從而把指定的文件和當前的源文件連成一個源文件

文件包含的處理過程: 在預處理的時候,用被包含文件的內容取代該文件包含指令,再對包含后的文件作一個源文件編譯

文件包含的搜索方式

#include<文件名>若指定文件目錄(如include)則會從指定目錄中去進行查找,否則就會按照標準的方式進行查找如:(gcc -o bin/hello -Iinclude src/hello)標準方式:從系統標準文件所在的目錄中去尋找要包含的文件
linux下:/usr/include或者/usr/lib中主要存放的是標準庫文件#include "文件名"先從存放C源文件的目錄中查找,然后從指定的目錄中去查找,最后再從C語言的標準庫文件中去查找

重要:文件的多重包含問題

概念:同一個文件被包含了多次

結果:多重包含可能會出現重復定義的編譯錯誤

解決方式:使用條件編譯(只能是一個源文件中去解決)來防止多重包含,凡是在頭文件前后,用條件編譯去編譯

如標準頭文件的寫法:#ifndef __HEADER_NAME_H__#define __HEADER_NAME_H__ #include "headername.h"http://其他的代碼#endif

如果在多個源文件中進行多重包含的話,使用多重包含的話是解決不了的。需要檢查。

建議注意: 在頭文件中盡量不要去定義一些全局變量,可以在源文件中去定義,用extern去修飾,將變量的作用于釋放帶整個程序

預處理操作符和預定義宏 預處理操作符號:#和##

C語言中有兩個預處理操作符號#和##,它可以在#define中使用 操作符號#通常成為字符串化的操作符號,它把其后的串變成用雙引號包圍的串 如:#define PRINT(FORMAT,VALUE) printf("the value of" #value "is" FORMAT "/n",VALUE) PRINT("%d",x+3); 連接操作符號##可以把兩個獨立的字符串鏈接成一個字符串 如: #define ADD_TO_SUM(sum_number,value) sum##sum_number +=value ADD_TO_SUM(5,25);

預定義宏和其他指令:

__FILE__ 進行編譯的源文件名稱__LINE__ 文件當前的行號__DATE__文件被編譯的日期__TIME__文件被編譯的時間__fun__當前所在的函數名稱其他預處理#error 自定義輸出的錯誤,是不能鏈接生成可執行文件的#line 設置當前的文件從哪一行開始計算 #line 100 "hello.c"#pragma 字節對齊預處理指令 #pragma message("helloworld");----->輸出提示相關信息

以上是個人在學習過程中所做的一些總結性東西,如有不對的地方,希望可以及時指出,歡迎繼續訪問。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品少妇videofree| 欧美成人午夜剧场免费观看| 91日本视频在线| 91chinesevideo永久地址| 中文字幕av一区中文字幕天堂| 俺去啦;欧美日韩| 成人天堂噜噜噜| 91在线观看免费高清完整版在线观看| 亚洲自拍偷拍一区| 亚洲va久久久噜噜噜| 2018国产精品视频| 91老司机精品视频| 国产女精品视频网站免费| 日本精品性网站在线观看| 国产精品久久久久久亚洲调教| 91精品国产综合久久香蕉922| 亚洲a级在线播放观看| 亚洲第一综合天堂另类专| 久久天天躁狠狠躁夜夜躁| 欧美激情影音先锋| 97成人精品视频在线观看| 欧美日韩国内自拍| 亚洲福利精品在线| 成人在线国产精品| 国产成人精品日本亚洲| 国产精品视频区1| 欧美与黑人午夜性猛交久久久| 欧美日韩精品中文字幕| 欧美精品做受xxx性少妇| 国产精品久久久久一区二区| 在线视频国产日韩| 国模极品一区二区三区| 日韩h在线观看| 91九色国产视频| 亚洲国语精品自产拍在线观看| 国产精品流白浆视频| 久久久国产成人精品| 欧美亚洲激情视频| 亚洲一区亚洲二区亚洲三区| 国产精品视频久久久久| 7m第一福利500精品视频| 中文字幕日韩欧美在线视频| 日韩av在线免费观看| 欧美激情视频在线免费观看 欧美视频免费一| 日韩精品在线免费观看视频| 日本中文字幕久久看| 久久久精品在线| 视频在线观看99| 亚洲精品国产免费| 亚洲色图13p| 性日韩欧美在线视频| 亚洲欧美日韩爽爽影院| 日韩国产精品一区| 久久九九国产精品怡红院| 亚洲精品国产精品久久清纯直播| 日韩成人av一区| 欧美久久精品一级黑人c片| 91精品国产91| 久久久久久国产免费| 亚洲免费视频一区二区| 精品国产一区久久久| 欧洲精品在线视频| 中文字幕久久精品| 91精品美女在线| 亚洲性视频网址| 日本伊人精品一区二区三区介绍| 91社影院在线观看| 国产在线视频2019最新视频| 国产又爽又黄的激情精品视频| 正在播放欧美视频| 国产精品成人免费视频| 中文字幕欧美专区| 久久久精品久久久久| 日韩二区三区在线| 国产亚洲综合久久| 7777精品视频| 欧美高清性猛交| 欧美第一页在线| 欧美日韩国产激情| 国产精品精品久久久久久| 日韩中文字幕国产| 欧美日韩国产综合视频在线观看中文| 一区二区三区久久精品| 欧美性猛交xxxx富婆| 色琪琪综合男人的天堂aⅴ视频| 久久精品国产69国产精品亚洲| 欧美高清视频在线观看| 中国日韩欧美久久久久久久久| 久久久成人的性感天堂| 亚洲性生活视频在线观看| 在线电影欧美日韩一区二区私密| 欧美日韩成人在线观看| 久久人人爽人人爽人人片av高清| 欧美国产精品人人做人人爱| 国产日韩欧美中文在线播放| 一本色道久久综合狠狠躁篇怎么玩| 成人午夜两性视频| 中文字幕亚洲一区二区三区| 亚洲免费伊人电影在线观看av| 成年人精品视频| 亚洲一区二区三区xxx视频| 91综合免费在线| 亚洲精品成人免费| 久久影院资源站| 久久九九精品99国产精品| 91极品女神在线| 日韩欧美大尺度| 狠狠躁夜夜躁人人躁婷婷91| 成人日韩av在线| 日韩av在线网页| 亚洲国产欧美一区二区丝袜黑人| 日韩美女av在线免费观看| 国产日韩欧美夫妻视频在线观看| 2021久久精品国产99国产精品| 亚洲视频视频在线| 操人视频在线观看欧美| 4k岛国日韩精品**专区| 亚洲精品影视在线观看| 日韩欧美国产骚| 亚洲激情视频网站| 欧美黄色成人网| 97精品视频在线| 丰满岳妇乱一区二区三区| 91久久国产精品91久久性色| 国产精品r级在线| 国产精品久久久久免费a∨大胸| 欧美俄罗斯乱妇| 狠狠做深爱婷婷久久综合一区| 成人免费在线视频网址| 欧美日韩一区二区在线播放| 欧美黑人极品猛少妇色xxxxx| 亚洲电影免费观看高清完整版| www日韩中文字幕在线看| 久99九色视频在线观看| 亚洲一区二区三区四区视频| 韩国三级日本三级少妇99| 国产精品一久久香蕉国产线看观看| 中文字幕亚洲自拍| 国产精品 欧美在线| 欧美激情一区二区三区在线视频观看| 亚洲肉体裸体xxxx137| 亚洲毛片在线看| 欧美专区在线播放| 欧美天天综合色影久久精品| 日韩成人在线视频网站| 色综合久久88色综合天天看泰| 色香阁99久久精品久久久| 亚洲色图综合网| 欧美性猛交xxxx富婆| 中文字幕久久精品| 国产精品美女久久久久av超清| 久久精品91久久久久久再现| 一区二区在线视频播放| 成人午夜在线影院| 成人97在线观看视频| 日韩av有码在线| 亚洲日本中文字幕免费在线不卡| 97在线精品国自产拍中文| 亚洲精品欧美日韩| 国产精品丝袜高跟| 91美女福利视频高清| 亚洲国产精品久久91精品| 亚洲天堂av在线免费| 亚洲综合社区网|