簡介C/C++預處置器的一些任務。本站提示廣大學習愛好者:(簡介C/C++預處置器的一些任務)文章只能為提供參考,不一定能成為您想要的結果。以下是簡介C/C++預處置器的一些任務正文
何等使人高興的一個成績啊
就在被帶到編譯器那邊之前,預處置器都邑對你的源代碼瞧上一瞧, 做一些格局化的任務,並履行任何你在源代碼外面留給它來履行的指令.
像甚麼?
好吧,預處置器的指令就被叫做預處置器指令,而他們都以一個#開首.
像 #include 如許?
准確.
每個被預處置器碰到的 # 敕令都邑招致在某種方法上對源代碼的修正. 讓我們來簡略的研討研討它們,然後我們就會以後這面前都是怎樣運轉的了.
#include
包括其他庫、類、接口等的頭文件。預處置器現實上就只是把全部頭文件復制到你的源代碼外面 (是的,這就是包括進攻之所所以件功德的緣由了).
#define
誰會不愛好宏呢! 預處置器會把一切界說的實體調換成被界說的代碼. 界說會一向連續直到發明這個界說的 #undef 指令.
#ifdef
前提行動告知預處置器包括在碰到聲明的前提成立的前提塊中的代碼. 你可以就像if-else語句一樣應用它們,從這外面選擇: #ifdef, #ifndef, #if, #else, 和 #elif, 而你老是要應用一個 #endif 作為停止。
#error #warning
用來向用戶發送新聞。預處置器會在 #error 處, 而不會在 #warning 處停上去. 兩種情形下他都邑發送他在指令面前(的括號外面)發明的字符串, 發送到屏幕作為輸入,是以它是一種確保針對你的平台一切OK的手動方法.
#line
用來在你碰到編譯毛病時修正顯示的毛病行號和文件名. 例如,參加你須要檢查一個來自編譯的中央文件的源文件(能夠是主動生成的).
#pragma
其它由編譯器說明的特別指令。你的編譯器文檔會告知你指令是怎樣用的,而你不要假定他們在全球都通用哦.
#assert #unassert
這些在老法式外面老是特殊受迎接的 (好吧,只需我也已經為如許一個法式任務過), 然則它們在如今曾經過時了。激烈建議不應用它們,這意味著不要把他們放到新的代碼外面
預界說宏
有很多可以應用的預界說宏:
__FILE__ 給出一個字符串的文件名
__LINE__ 給出以後的行號(整型)
__DATE__ 以後編譯日期的字符串
__TIME__ 以後編譯時光的字符串
__STDC__ 同編譯器相干的,但經常被界說成1,以聲明同ISO C尺度兼容.
__cplusplus 在編譯一個C++法式是老是會被界說
特殊是開首兩個在調試時真的異常有效。只需拿出它們倆,不消你本身編寫文件和行處置類,就可以奇異的讓你取得豐碩的信息輸入.
你的編譯器能夠還支撐其它的宏,例如,你這從 這裡 取得(面向GCC)的全部宏清單.
那末當你運轉預處置器時現實會產生甚麼呢?
1. 調換一切的三字母組合,我會在未來的一篇文章中議論到他,由於雖然他只是一個汗青上的特征(並且你也要在GCC中對它停止切換),它仍讓是很風趣的.
2. 將並列的源代碼分紅多行.
3. 移除一切的正文並用一個空格調換.
4. 處置(我們下面講到的)的預處置器指令。關於 #include, 他會在新文件上遞歸履行1 - 3步 :-)
5. 處置本義序列.
6. 把文件發送給編譯器
假如你想看看預處置以後你的文件會是甚麼模樣 (誰不想呢?),你可以向 gcc 傳入 -E 選項. 這將會想stdout尺度輸入發送預處置過的源代碼,而且沒有編譯和銜接就直接終止gcc敕令的履行。
例如
g++ -E myfile.cpp
你也能夠應用這個參數:
-save-temps
編譯的後會有一份暫時文件。
拿上面這個簡略的法式說吧:
#include <stdio.h> #define ONE 1 #define TWO 2 int main() { printf("%d, %d\n", ONE, TWO); return 0; }
用上面這行敕令編譯
g++ hello.cpp -save-temps
編譯完後, 會在文件夾中生成兩個文件: hello.s 和 hello.ii
hello.s 外面是匯編代碼, 而 hello.ii 則是預處置事後的源代碼。
用文本編纂器翻開 hello.ii , 你會發明多出很多代碼. 那是由於 #include 指令把 stdio 頭文件的代碼加出來了。
假如你把轉動條拉到最底下, 就會發明, printf 那一行的宏界說 ONE 和 TWO 曾經被預處置器調換成 1 和 2 了 .
奇異吧!
其實它只是在編譯的時刻, 把你的源代碼文件復制一份, 看成暫時文件, 然後把外面的預處置指令調換失落. 用完後就把這個暫時文件刪了. 所以普通情形下我們不曉得這個文件的存在.