當前位置:首頁 » 編程軟體 » 編譯預處理有幾種

編譯預處理有幾種

發布時間: 2025-03-01 17:31:18

A. include<stdi.h>是正確的編譯預處理命令嗎

不是。
程序設計語言的預處理的概念:在編譯之前進行的處理。c語言的預處理主要有三個方面的內容:1.宏定義;2.文件包含;3.條件編譯。預處理命令以符號#開頭。
編譯時以包含處理以後的文件為編譯單位,被包含的文件是源文件的一部分。
編譯以後只得到一個目標文件.obj。
被包含的文件又被稱為標題文件或頭部文件、頭文件,並且常用.h作擴展名。
修改頭文件後所有包含該文件的文件都要重新編譯。
頭文件的內容除了函數原型和宏定義外,還可以有結構體定義,全局變數定義。

B. C語言中條件編譯的作用

條件編譯屬於三種宏定義中的一種,條件指示符的最主要目的是防止頭文件的重復包含和編譯,例如:一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變數重復定義的錯誤


條件編譯常用的有四個預處理命令:#if、#else、#elif、#endif。

#if指令的形式為:

#if常量表達式
代碼塊
#endif

#if後面的常量表達式為值,則編譯它與#endif之間的代碼,否則跳過這些代碼。指令#endif標識一個#if塊的結束。


#else被使用來標志#if的末尾和#else塊的開始。這是必須的,因為任何#if僅有一個#endif與之關聯。


#elif意指"else if",它形成一個if else if嵌套語句用於多種編譯選擇。#elif後面跟一個常量表達式,如果表達式是真,則編譯其後的代碼塊,不對其他#elif表達式進行檢測,否則順序測試下一塊。常見的形式如下:

形式1:

#ifdef標識符
/*程序段1*/
#else
/*程序段2*/
#endif

它的作用是當標識符已經由#define定義過了,則編譯程序段1,否則編譯程序段2,也可以使用簡單形式

#ifdef標識符
/*程序段1*/
#endif

形式2:

#ifndef標識符
#define標識符
/*程序段1*/
#else
/*程序段2*/
#endif

它的作用是當標識符沒有由#define定義過,則編譯程序段1,否則編譯程序段2 ,也可以使用簡單形式

#ifndef標識符
#define標識符
/*程序段1*/
#endif

形式3:

#if表達式
/*程序段1*/
#else
*程序段2*/
#endif

它的作用是 當「表達式」值為真時編譯程序段1。否則則編譯程序段2,也可以使用簡單形式

#if表達式
/*程序段1*/
#endif

形式4:

#if表達式1
/*程序段1*/
#elif表達式2
/*程序段2*/
............
#elif表達式n
/*程序段n*/
#endif

它的作用是當「表達式1」值為1時編譯程序段1,表達式2的值為真是編譯程序段2,否則依次順序判斷到表達式n。


最後,條件編譯的條件是一個常量表達式,支持邏輯與&&和或||運算。以上四種形式的條件編譯預處理結構都可以嵌套使用,

標識符: 在理論上來說可以是自由命名的,但每個頭文件的這個標識符都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h。

#ifndef_STDIO_H_
#define_STDIO_H_
/*程序段*/
#endif

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

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

D. c語言編譯預處理

編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。

如果用一張圖來表示:

讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理

[析] 偽指令主要包括以下四個方面

(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的'出現不再被替換。

(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉

(3)頭文件包含指令,如#include "FileName"或者#include 等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。

包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。

(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。

注意:

預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。

E. c語言入門 第十九章 預處理指令

c語言程序從代碼到可執行的程序,中間要經過幾個階段,大部分的過程都會由編譯器自動完成,這里我們只介紹和我們寫代碼有關的部分,就是預處理。

預處理,就是在編譯之前,對代碼進行的處理。我們經常使用的預處理指令大概可以分成三類。

第一類是包含文件,我們在之前寫的代碼當中,第一句話就是 #include "...",這就是一個典型的預處理命令,作用就是 在編譯代碼之前,把另外一個源文件當中的內容引入到當前的c文件中。例如引入 stdio.h 這個頭文件,提供了一系列的函數,如printf和scanf。

第二類是宏定義,宏定義可以在預處理階段,對代碼的文本內容進行替換。#define 宏名 替換內容,在編譯之前,會把代碼當中的宏定義內容,對代碼的內容進行整理。宏定義和變數定義最大的區別就是,宏定義只是在代碼編譯之前,對代碼的當中出現的宏進行文本替換,而變數的定義是在代碼編譯之後,執行的過程當中創建。例如,變數代表了一個內存地址,可以去修改內存地址的值。而宏定義只是簡單的對代碼進行文本替換,這樣寫程序就會出錯,因為在編譯之前程序就會被替換處理為a+=1中a直接被10替換了,語句就變成了10+=1,這很顯然就是錯的。在寫代碼的時候,我們為了和變數進行區分,宏定義通常都使用大寫字母。宏定義的替換一般我們稱作宏展開。宏定義還可以使用類似函數的參數的形式,#define 宏(參數,...) 替換內容。這樣寫程序就會得到正確的結果。

第三類是條件編譯,預處理當中的第三部分內容就是可以對程序進行有條件的編譯。例如,假如我們需要寫一個能夠在多個平台都能夠執行的程序,那麼在不同平台上引入的頭文件,和庫函數可能並不相同,那就需要我們根據具體的平台,來選擇性的編譯代碼。條件編譯使用的指令有 #if,#ifdef,#ifndef,#elif,#else,#endif 用法和if...else語句類似,常用的結構是。

除了以上幾種之外,還有其他的一些預處理指令,例如 #pragma,#error,#line等等,具體的內容可以查看c語言的手冊。

F. 什麼是預編譯,何時需要預編譯

預編譯又稱為預處理,是做些代碼文本的替換工作

預編譯又稱為預處理,是做些代碼文本的替換工作

處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等

就是為編譯做的預備工作的階段

主要處理#開始的預編譯指令

預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:

(1)#include 指令

該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用" "括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為"h"或"cpp"的頭文件。

注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。

(2)#define指令

該指令有三種用法:

第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;

第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);

第三種是定義"函數",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。

第四種是定義"宏函數",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。

(3)#if、#else和#endif指令

這些指令一般這樣配合使用:

#if defined(標識) //如果定義了標識

要執行的指令

#else

要執行的指令

#endif

在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:

#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,

//每個頭文件的標識符都不應相同。

//起標識符的常見方法是若頭文件名為"abc.h"

//則標識為"abc_h"

#define XXX

真正的內容,如函數聲明之類

#endif

熱點內容
如何查看安卓等級 發布:2025-03-01 20:29:44 瀏覽:92
linux內存數據 發布:2025-03-01 20:25:33 瀏覽:844
安卓手機來電等待在哪裡 發布:2025-03-01 20:21:47 瀏覽:946
主力清洗源碼 發布:2025-03-01 20:21:23 瀏覽:141
繞ID腳本 發布:2025-03-01 20:13:47 瀏覽:891
艾希安卓手機哪裡買 發布:2025-03-01 20:13:47 瀏覽:304
44演算法 發布:2025-03-01 20:12:48 瀏覽:344
qq裡面存儲的密碼在哪裡 發布:2025-03-01 20:08:28 瀏覽:865
php自動完成 發布:2025-03-01 20:04:20 瀏覽:625
axel源碼 發布:2025-03-01 19:52:17 瀏覽:226