導航:首頁 > 程序命令 > c中預處理命令教學

c中預處理命令教學

發布時間:2024-05-03 07:18:22

❶ C語言中很多的預處理指令include、define等等它們各自的意義分別是什麼

include的作用: #include叫做「文件包含」 / include 語句包含並運行指定文件。 功能:它的功能是用來指定文件的全部內容替換程序中的命令行,從而使指定的文件與當前源文件連成一個源文件 書寫格式: #include <文件名> //表示編譯系統根據系統頭文件存放的目錄路徑去搜索系統頭文件,而不是在源文件目錄去查找 #include "文件名" //表示編譯系統首先在當前的源文件目錄中查找,若未找到才根據系統的頭文件存放的目錄路徑去搜索系統頭文件 //系統定義的頭文件通常使用尖括弧;用戶自定義的頭文件通常使用雙引號。 //一般來說,如果為調用庫函數而用#include命令來包含相關的頭文件,則用尖括弧,以節約查找時間。 //如果要包含的是用戶自己編寫的文件(這種文件一般都在用戶當前的目錄中),一般用雙撇號。 //若文件不在當前目錄中,在雙撇號內應該給出文件路徑(如#include"C:\wang\file2.h") ----------------- 1.#define 的作用 在C或C++語言源程序中允許用一個標識符來表示一個字元串,稱為「宏」。被定義為「宏」的標識符稱為「宏名」。在編譯預處理時,對程序中所有出現的「宏名」,都用宏定義中的字元串去代換,這稱為「宏代換」或「宏展開」。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。 在C或C++語言中,「宏」分為有參數和無參數兩種。 2. 無參宏定義 無參宏的宏名後不帶參數。 其定義的一般形式為: #define 標識符 字元串 其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為宏定義命令。「標識符」為所定義的宏名。「字元串」可以是常數、表達式、格式串等。 例如: #define M (a+b) 它的作用是指定標識符M來代替表達式(a+b)。在編寫源程序時,所有的(a+b)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(a+b)表達式去置換所有的宏名M,然後再進行編譯。 程序1: #define M (a+b) main(){ int s,y; printf("input a number: "); scanf("%d",&y); s=M*M; printf("s=%d\n",s); } 上常式序中首先進行宏定義,定義M來替代表達式(a+b),在 s= M * M 中作了宏調用。在預處理時經宏展開後該語句變為: S=(a+b)*(a+b) 但要注意的是,在宏定義中表達式(a+b)兩邊的括弧不能少。否則會發生錯誤。 如當作以下定義後:#difine M (a)+(b) 在宏展開時將得到下述語句:S= (a)+(b)*(a)+(b) 對於宏定義還要說明以下幾點: 1. 宏定義是用宏名來表示一個字元串,在宏展開時又以該字元串取代宏名,這只是一種簡單的代換,字元串中可以含任何字元,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程序時發現。 2. 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。 3. 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。 3. 帶參宏定義 c語言允許宏帶有參數。在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。 帶參宏定義的一般形式為: #define 宏名(形參表) 字元串 在字元串中含有各個形參。 帶參宏調用的一般形式為: 宏名(形參表) 例如: #define M(y) ((y)*(y)+3*(y)) /*宏定義*/ .... k=M(5); /*宏調用*/ .... 在宏調用時,用實參5去代替形參y,經預處理宏展開後的語句為: k=5*5+3*5 程序2: #define MAX(a,b) (a>b)?a:b main(){ int x,y,max; printf("input two numbers: "); scanf("%d%d",&x,&y); max=MAX(x,y); printf("max=%d\n",max); } 上常式序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現在條件表達式中。程序第七行max=MAX(x,y)為宏調用,實參x,y,將代換形參a,b。宏展開後該語句為: max=(x>y)?x:y; 用於計算x,y中的大數。

❷ 關於C語言預處理命令

第一句有問題。
比如
#ifndef WIN32
#endif printf("OK\n");
在這里,這個printf就不會被執行。也就是說, 一行中, 只能有一條預處理指令,
當編譯的預處理階段, 編譯器識別了一條完整的預處理指令後,後面的所有東西他都不要了。
對於第二句,在函數里,我們是可以使用預處理指令的。
比如
void fun(void)
{
#ifdef WIN32
... // 對於windows系統環境的操作
#else
... // 對於windows以外的系統環境的操作
#endif /* WIN32 */
...
}

樓上的同學, 你是在哪兒本書上看的? 介紹一下唄

❸ c語言中預處理命令都有哪些

我們可以在C源程序中插入傳給編譯程序的各中指令,這些指令被稱為預處理器指令,它們擴充了程序設計的環境。現把常用的預處理命令總結如下: x0dx0a1. 預處理程序x0dx0a按照ANSI標準的定義,預處理程序應該處理以下指令:x0dx0a#if #ifdef #ifndef #else #elifx0dx0a#endifx0dx0a#definex0dx0a#undefx0dx0a#linex0dx0a#errorx0dx0a#pragmax0dx0a#includex0dx0a顯然,上態李族述所有的12個預處理指令都以符號#開始,,每條預處理指令必須獨佔一行。x0dx0a2. #definex0dx0a#define指令定義一個標識符和一個串(也就是字元集),在源程序中發現該標識符時,都用該串替換之。這種標識符稱為宏名字,相應的替換稱為宏代換。一般形式如下:x0dx0a#define macro-name char-sequencex0dx0a這種語句不用分號結尾。宏名字和串之間可以有多個空白符,但串開始後只能以新行終止。x0dx0a例如:我們使用LEFT代表1,用RIGHT代表0,我們使用兩個#define指令:x0dx0a#define LEFT 1x0dx0a#define RIGHT 0x0dx0a每當在源程序中遇到LEFT或RIGHT時,編譯程序都用1或0替換。x0dx0a定義一個宏名字之後,可以在其他宏定義中使用,例如:x0dx0a#define ONE 1x0dx0a#define TWO ONE+ONEx0dx0a#define THREE ONE+TWOx0dx0a宏代換就是用相關的串替代標識符。因此,如果希望定義一條標准錯誤信息時,可以如下定義:x0dx0a#define ERROR_MS 「Standard error on input \n」x0dx0a如果一個串長於一行,可在行尾用反斜線」\」續行,如下:x0dx0a#define LONG_STRING 「This is a very very long \x0dx0aString that is used as an example」x0dx0a3. #errorx0dx0a#error指令強制編譯程序停止編譯,它主要用於程序調試。#error指令的一般形式是:x0dx0a#error error-messagex0dx0a注意,宏串error-message不用雙引號包圍。遇到#error指令時,錯誤信息被顯示,可能同時還顯示編譯程序作者預先定義的其他內容。x0dx0a4. #includex0dx0a程序中的#include指令要求編譯程序讀入另一個源文件。被讀入文件的名字必須用雙引號(「」)或一對尖括弧(<>)包圍,例如:x0dx0a#include 「stdio.h」x0dx0a#include x0dx0a都使C編譯程序讀入並編譯頭文件帆弊以用於I/O系統庫函數。x0dx0a包含文件中可以包含其他#include指令,稱為嵌套包含。允許的最大嵌套深度隨編譯器而變。x0dx0a文件名被雙括弧或尖括弧包圍決定了對指定文件的搜索方式。文件名被尖括弧包圍時,搜索按編譯程序作者的定義進行,一般用於搜索某些專門放置包含文件的特殊目錄。當文件名被雙括弧包圍時,搜索按編譯程序實時的規定進行,一般搜索當前目錄。如未發現,再按尖括弧包圍時的辦法重新搜索一次。x0dx0a通常,絕大多數程序員使用尖括弧包圍標準的頭文件,雙引號用於包圍與當前程序相關的文件名。x0dx0ax0dx0a5. 條件編譯指令x0dx0a若干編譯指令允許程序員有選擇的編譯程序源代碼的不同部分,這種過程稱為條件編譯。x0dx0a5.1#if、#else、#elif #endifx0dx0a條件編譯指令中最常用的或許是#if,#else,#elif和#endif。這些指令允擾檔許程序員根據常數表達式的結果有條件的包圍部分代碼。x0dx0a#if的一般形式是:x0dx0a#if constant-expressionx0dx0aStatement sequencex0dx0a#endifx0dx0a如#if後的常數表達式為真,則#if和#endif中間的代碼被編譯,否則忽略該代碼段。#endif標記#if塊的結束。x0dx0a#else指令的作用與C語言的else相似,#if指令失敗時它可以作為備選指令。例如:x0dx0a#include x0dx0a#define MAX 100x0dx0aInt main(void)x0dx0a{x0dx0a#if MAX>99x0dx0aprintf(「Compiled for array greater than 99.\n」);x0dx0a#elsex0dx0aprintf(「Complied for small array.\n」);x0dx0a#endifx0dx0areturn 0;x0dx0a}x0dx0a注意,#else既是標記#if塊的結束,也標記#else塊的開始。因為每個#if只能寫一個#endif匹配。x0dx0a#elif指令的意思是「否則,如果」,為多重編譯選擇建立一條if-else-if(如果-否則-如果鏈)。如果#if表達式為真,該代碼塊被編譯,不測試其他#elif表達式。否則,序列中的下一塊被測試,如果成功則編譯之。一般形式如下:x0dx0a#if expressionx0dx0aStatement sequencex0dx0a#elif expression1x0dx0aStatement sequencex0dx0a#elif expression2x0dx0aStatement sequencex0dx0a.x0dx0a.x0dx0a.x0dx0a#elif expressionx0dx0aStatement sequencex0dx0a#endifx0dx0a5.2#ifdef和#ifndefx0dx0a條件編譯的另一個方法是使用編譯指令#ifdef和#ifndef,分別表示「如果已定義」和「如果未定義」。#ifdef的一般形式如下:x0dx0a#ifdef macro-namex0dx0aStatement sequencex0dx0a#endifx0dx0a如果macro-name原先已經被一個#define語句定義,則編譯其中的代碼塊。x0dx0a#ifndef的一般形式是:x0dx0a#ifndef macro-namex0dx0aStatement sequencex0dx0a#endifx0dx0a如果macro-name當前未被#define語句定義,則編譯其中的代碼塊。x0dx0ax0dx0a我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。x0dx0a#ifdef和#ifndef都可以使用#else或#elif語句。x0dx0a#inlucde x0dx0a#define T 10x0dx0aInt main(void)x0dx0a{x0dx0a#ifdef tx0dx0aPrintf(「Hi T\n」);x0dx0a#elsex0dx0aPrintf(「Hi anyone\n」);x0dx0a#endifx0dx0a#ifndef Mx0dx0aPrintf(「M Not Defined\n」);x0dx0a#endifx0dx0aReturn 0;x0dx0a}x0dx0a6. #undefx0dx0a#undef指令刪除前面定義的宏名字。也就是說,它「不定義」宏。一般形式為:x0dx0a#undef macro-namex0dx0a7. 使用definedx0dx0a除#ifdef之外,還有另外一種確定是否定義宏名字的方法,即可以將#if指令與defined編譯時操作符一起使用。defined操作符的一般形式如下:x0dx0adefined macro-namex0dx0a如果macro-name是當前定義的,則表達式為真,否則為假。x0dx0a例如,確定宏MY是否定義,可以使用下列兩種預處理命令之一:x0dx0a#if defined MYx0dx0a或x0dx0a#ifdef MYx0dx0a也可以在defined之前加上感嘆號」!」來反轉相應的條件。例如,只有在DEBUG未定義的情況下才編譯。x0dx0a#if !defined DEBUGx0dx0aPrintf(「Final Version!\n」);x0dx0a#endifx0dx0a使用defined的一個原因是,它允許由#elif語句確定的宏名字存在。x0dx0a8. #linex0dx0a#line指令改變__LINE__和__FILE__的內容。__LINE__和__FILE__都是編譯程序中預定義的標識符。標識符__LINE__的內容是當前被編譯代碼行的行號,__FILE__的內容是當前被編譯源文件的文件名。#line的一般形式是:x0dx0a#line number 「filename」x0dx0a其中,number是正整數並變成__LINE__的新值;可選的「filename」是合法文件標識符並變成__FILE__的新值。#line主要用於調試和特殊應用。x0dx0ax0dx0a9. #pragmax0dx0a#pragma是編譯程序實現時定義的指令,它允許由此向編譯程序傳入各種指令。例如,一個編譯程序可能具有支持跟蹤程序執行的選項,此時可以用#pragma語句選擇該功能。編譯程序忽略其不支持的#pragma選項。#pragma提高C源程序對編譯程序的可移植性。x0dx0a10. 預處理操作符#和##x0dx0a有兩個預處理操作符:#和##,它們可以在#define中使用。x0dx0a操作符#通常稱為字元串化的操作符,它把其後的串變成用雙引號包圍的串。例如:x0dx0a#include x0dx0a#define mkstr(s) #sx0dx0aint main(void)x0dx0a{x0dx0aPrintf(mkstr(I like C));x0dx0aReturn 0;x0dx0a}x0dx0a預處理程序把以下的語句:x0dx0aPrintf(mkstr(I like C));x0dx0a變成x0dx0aPrintf(「I like C」);x0dx0a操作符##把兩個標記拼在一起,形成一個新標記。例如:x0dx0a#include x0dx0a#define concat(a,a) a##bx0dx0aint main(void)x0dx0a{x0dx0aInt xy = 10;x0dx0aPrintf(「%d」,concat(x,y));x0dx0aReturn 0;x0dx0a}x0dx0a預處理程序把以下語句:x0dx0aPrintf(「%d」,concat(x,y));x0dx0a變成x0dx0aPrintf(「%d」,xy);x0dx0a操作符#和##主要作用是允許預處理程序對付某些特殊情況,多數程序中並不需要。x0dx0a11. 預定義宏x0dx0aC規范了5個固有的預定義宏,它們是:x0dx0a__LINE__x0dx0a__FILE__x0dx0a__DATE__x0dx0a__TIME__x0dx0a__STDC__x0dx0a__LINE__和__FILE__包含正在編譯的程序的行號和文件名。x0dx0a__DATE__和內容形如month/day/year(月/日/年)的串,代表源文件翻譯成目標碼的日期。x0dx0a__TIME__中的串代表源代碼編譯成目標碼的時間,形如hour:minute:second(時:分:秒)x0dx0a如果__STDC__的內容是十進制常數1,則表示編譯程序的實現符合標准C。

❹ c語言中預處理命令都有哪些

C語言的預處理主要有三個方面的內容: 1.宏定義; 2.文件包含; 3.條件編譯。x0dx0a 預處理命令以符號「#」開頭。x0dx0ax0dx0a宏定義命令:#define、#undef,用來定義和解除宏。(值得注意的是還可以定義帶參數的宏)x0dx0ax0dx0a文件包含命令:#include "文件名" 或者 #include <文件名>。使用前者時會優先從當前目錄查找頭文件,使用後者時優先從默認的系統目錄查找。x0dx0ax0dx0a條件編譯:#ifdef、#else、#endif、#elif 等。出於程序兼容性的考慮,有些語句希望在條件滿足時才編譯。這時候會用到條件編譯的命令。

閱讀全文

與c中預處理命令教學相關的資料

熱點內容
clp在單片機中是什麼意思 瀏覽:144
還珠格格韓國源碼 瀏覽:892
linuxpostgresql配置 瀏覽:873
雲伺服器如何掛機賺錢 瀏覽:549
null是java關鍵字 瀏覽:688
看過讀過聽過是什麼APP 瀏覽:834
java判斷數據是否存在 瀏覽:15
一巴掌解壓圖片 瀏覽:976
自己搭建的伺服器如何安全 瀏覽:753
miui源碼公開 瀏覽:447
linuxbin是什麼 瀏覽:332
php小項目留言板 瀏覽:955
得推論壇系統源碼v24 瀏覽:67
android根據號碼查詢聯系人 瀏覽:496
命令行ftp上傳 瀏覽:338
大爺程序員 瀏覽:198
自私的基因pdf 瀏覽:479
程序員是怎麼做優化設置 瀏覽:251
命令與征服現代沖突視頻 瀏覽:678
基於單片機的文獻綜述 瀏覽:999