導航:首頁 > 程序命令 > 預處理命令在程序中

預處理命令在程序中

發布時間:2022-08-28 17:29:00

1. 常見的預處理命令有哪兩種

很多小夥伴在自己寫代碼的時候,已經多次使用過include命令。使用庫函數之前,應該用include引入對應的頭文件。其實這種以#號開頭的命令稱為預處理命令。

C語言源文件要經過編譯、鏈接才能生成可執行程序:

1) 編譯(Compile)會將源文件(.c文件)轉換為目標文件。對於 VC/VS,目標文件後綴為.obj;對於GCC,目標文件後綴為.o。

編譯是針對單個源文件的,一次編譯操作只能編譯一個源文件,如果程序中有多個源文件,就需要多次編譯操作。

2) 鏈接(Link)是針對多個文件的,它會將編譯生成的多個目標文件以及系統中的庫、組件等合並成一個可執行程序。

關於編譯和鏈接的過程、目標文件和可執行文件的結構、.h 文件和 .c 文件的區別,我們將在後期專題中講解。

在實際開發中,有時候在編譯之前還需要對源文件進行簡單的處理。例如,我們希望自己的程序在 Windows 和 Linux 下都能夠運行,那麼就要在 Windows 下使用 VS 編譯一遍,然後在 Linux 下使用 GCC 編譯一遍。但是現在有個問題,程序中要實現的某個功能在 VS 和 GCC 下使用的函數不同(假設 VS 下使用 a(),GCC 下使用 b()),VS 下的函數在 GCC 下不能編譯通過,GCC 下的函數在 VS 下也不能編譯通過,怎麼辦呢?

這就需要在編譯之前先對源文件進行處理:如果檢測到是 VS,就保留 a() 刪除 b();如果檢測到是 GCC,就保留 b() 刪除 a()。

這些在編譯之前對源文件進行簡單加工的過程,就稱為預處理(即預先處理、提前處理)。

預處理主要是處理以開頭的命令,例如include <stdio.h>等。預處理命令要放在所有函數之外,而且一般都放在源文件的前面。

預處理是C語言的一個重要功能,由預處理程序完成。當對一個源文件進行編譯時,系統將自動調用預處理程序對源程序中的預處理部分作處理,處理完畢自動進入對源程序的編譯。

編譯器會將預處理的結果保存到和源文件同名的.i文件中,例如 main.c 的預處理結果在 main.i 中。和.c一樣,.i也是文本文件,可以用編輯器打開直接查看內容。

C語言提供了多種預處理功能,如宏定義、文件包含、條件編譯等,合理地使用它們會使編寫的程序便於閱讀、修改、移植和調試,也有利於模塊化程

2. 預處理指令只能位於C源程序文件的首部嗎 為什麼

不一定的,一般來說是要放在文件的首部的,1、防止編譯時出現,還沒有引入就使用的情況(如一些庫函數等的);2、代碼看起來美觀,大方,便於閱讀和修改

3. 在C語言中,預處理指令有什麼作用比如#define 宏名 字元串

C語言預處理程序的作用是根據源代碼中的預處理指令修改你的源代碼。預處理指令是一種命令語句(如#define),它指示預處理程序如何修改源代碼。在對程序進行通常的編譯處理之前,編譯程序會自動運行預處理程序,對程序進行編譯預處理,這部分工作對程序員來說是不可見的。
預處理程序讀入所有包含的文件以及待編譯的源代碼,然後生成源代碼的預處理版本。在預處理版本中,宏和常量標識符已全部被相應的代碼和值替換掉了。如果源代碼中包含條件預處理指令(如#if),那麼預處理程序將先判斷條件,再相應地修改源代碼。
下面的例子中使用了多種預處理指令:
# include <stdio. h>
# define TRUE 1
# define FALSE (!TRUE)
# define GREATER (a, b) ((a) > (b) ? (TRUE) : (FALSE))
# define PIG-LATIN FALSE
void main (void);
void main (void)
{
int x, y;
# if PIG_LATIN
printf("Easeplay enternay ethay aluevay orfay xnay:") ;
scanf("%d", &x) ;
printf("Easeplay enternay ethay aluevay orfay ynay:");
scanf("%d", &y);
#else
printf(" Please enter the value for x: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y);
# endif
if (GREATER(x, y) = = TRUE)
{
# if PIG- LATIN
printf("xnay islay eatergray anthay ynay!\n");
#else
printf {" x is greater than y! \n" ) ;
# endif
}
else
{
# if PIG_LATIN
printf ("xnay islay otnay eatergray anthay ynay!\n");
#else
printf ("x is not greater than y!\n");
# endif
}
}
上例通過預處理指令定義了3個標識符常量(即TRUE,FALSE和PIG_LATIN)和一個宏(即GREATER(a,b)),並使用了一組條件編譯指令。當預處理程序處理上例中的源代碼時,它首先讀入stdio.h頭文件,並解釋其中的預處理指令,然後把所有標識符常量和宏用相應的值和代碼替換掉,最後判斷PIG_LATIN是否為TRUE,並由此決定是使用拉丁文還是使用英文。
如果PIG_LATIN為FALSE,則上例的預處理版本將如下所示:
/ * Here is where all the include files
would be expanded. * /
void main (void)
{
int x, y;
printf("Please enter the value for X: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y),
if (((x) > (y) ? (1) : (!1)) == 1)
{
printf("x is greater than y!\n");
}
else
{
printf{"x is not greater than y!\n");
}
}
多數編譯程序都提供了一個命令行選項,或者有一個獨立的預處理程序,可以讓你只啟動預處理程序並將源代碼的預處理版本保存到一個文件中。你可以用這種方法查看源代碼的預處理版本,這對調試與宏或其它預處理指令有關的錯誤是比較有用的。
中國物聯網校企聯盟技術部

4. C語言中的預處理命令行的處理是否是在程序執行的過程中執行的!!!求大神!!求解析!!!

編譯的時候執行的,也就是說程序還沒被執行

5. 若要使用字元串函數,需要在程序中書寫的預處理命令是

摘要 預處理(或稱預編譯)是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理指令指示在程序正式編譯前就由編譯器進行的操作,可放在程序中任何位置。

6. 關於C語言預處理命令

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

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

7. 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中的大數。

8. c程序在執行過程中對預處理命令進行處理這一說法為什麼是錯誤的

C語言在編譯前由預處理器對預處理命令進行處理,編譯時進行語法分析。執行過程就是運行程序。

程序設計語言的預處理的概念:在編譯之前進行的處理。

C語言的預處理主要有三個方面的內容:

1、宏定義;

2、文件包含;

3、條件編譯。 預處理命令以符號「#」開頭。

C程序的源代碼中可包括各種編譯指令,這些指令稱為預處理命令。雖然它們實際上不是C語言的一部分,但卻擴展了C程序設計的環境。本節將介紹如何應用預處理程序和注釋簡化程序開發過程,並提高程序的可讀性。

(8)預處理命令在程序中擴展閱讀

C語言無參數宏定義

在C語言源程序中允許用一個標識符來表示一個字元串,稱為「宏」。被定義為「宏」的標識符稱為「宏名」。在編譯預處理時,對程序中所有出現的「宏名」,都用宏定義中的字元串去代換,這稱為「宏代換」或「宏展開」。

宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。在C語言中,「宏」分為有參數和無參數兩種。本節討論無參數宏。

無參宏的宏名後不帶參數。其定義的一般形式為:#define 標識符 字元串

其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為宏定義命令。「標識符」為所定義的宏名。「字元串」可以是常數、表達式、格式串等。

在前面介紹過的符號常量的定義就是一種無參宏定義。此外,常對程序中反復使用的表達式進行宏定義。例如:#define M (y*y+3*y)

9. C++中預處理指令是什麼

C++中,預處理命令是以#號開頭,結尾沒有分號的命令行。這些命令會在編譯開始前由編譯器執行。有三種預處理命令:
1. 宏定義;
2. 文件包含;
3. 條件編譯。
宏定義命令格式為:
#define 標識符 替換文本
其中"標識符"稱為宏名,替換文本可以是任意的字元串。執行宏替換時編譯器將全部的宏名替換為替換文本。
文件包含命令格式為:
#include <文件名> 或#include "文件名"
文件名用尖括弧或雙引號括起來都是合法的。一般預設頭文件用尖括弧,自定義頭文件用雙引號。原因:用雙引號會先在當前目錄下查找。
條件編譯命令有很多種格式,這里只列出並解釋其中兩種:
格式1:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的意思是:如果標識符已經被宏定義,則編譯程序段1,否則編譯程序段2。
格式2:
#ifndef 標識符
程序段1
#else
程序段2
#endif
它的意思是:如果標識符沒有被宏定義,則編譯程序段1,否則編譯程序段2。

閱讀全文

與預處理命令在程序中相關的資料

熱點內容
網路編程經典書籍 瀏覽:608
曲靖創建網站java程序員 瀏覽:682
256位加密中是什麼意思 瀏覽:91
php多維數組去重 瀏覽:305
做程序員這一行儲備人才怎麼看 瀏覽:458
參加密逃文 瀏覽:327
蘋果編程語言ios 瀏覽:763
求解病態系統常用的演算法 瀏覽:993
駕校用的app叫什麼 瀏覽:219
數控編程線的纏繞方法 瀏覽:972
安卓線性布局怎麼設計計算器布局 瀏覽:24
拓本pdf 瀏覽:79
2017法碩指南pdf 瀏覽:295
linuxphp命令參數 瀏覽:425
可靠性預測和推薦演算法 瀏覽:855
程序員送女友的相冊 瀏覽:254
壓縮文件怎麼設置打開加密 瀏覽:768
tracert命令結果詳解 瀏覽:360
唯賽思通用什麼APP 瀏覽:376
古玩哪個app好賣 瀏覽:149