❶ 關於C語言預處理命令
第一句有問題。
比如
#ifndef WIN32
#endif printf("OK\n");
在這里,這個printf就不會被執行。也就是說, 一行中, 只能有一條預處理指令,
當編譯的預處理階段, 編譯器識別了一條完整的預處理指令後,後面的所有東西他都不要了。
對於第二句,在函數里,我們是可以使用預處理指令的。
比如
void fun(void)
{
#ifdef WIN32
... // 對於windows系統環境的操作
#else
... // 對於windows以外的系統環境的操作
#endif /* WIN32 */
...
}
樓上的同學, 你是在哪兒本書上看的? 介紹一下唄
❷ C語言 一行只能有一個預處理命令嗎
在源文件的一行上可以有多條預處理指令。
預處理指令是以#號開頭的代碼行,# 號必須是該行除了任何空白字元外的第一個字元。
# 後是指令關鍵字,在關鍵字和 # 號之間允許存在任意個數的空白字元,整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。
C語言中#開頭的是預處理指令,不是C語句的一部分#開頭的語句,在預處理階段,由預處理器處理。
例如:
#include預處理器會將stdio.h文件的內容加入到當前文件的頭部,而#defineCONST10則會將文件中的CONST,用10代替(是直接代替)預處理完畢後,才對文件進行編譯。
(2)c語言沒有預處理命令擴展閱讀
1、預處理功能是C語言特有的功能,它是在對源程序正式編譯前由預處理程序完成的,程序員在程序中用預處理命令來調用這些功能。
2、為了避免宏代換時發生錯誤,宏定義中的字元串應加括弧,字元串中出現的形式參數兩邊也應加括弧。
3、文件包含是預處理的一個重要功能,它可用來把多個源文件連接成一個源文件進行編譯,結果將生成一個目標文件。
❸ C語言中為什麼要設置預處理命令沒有預處理命令不行嗎有什麼好處
簡單的只有一個main函數的可以,但最好有,目的是為了提高編程效率。連接庫。
❹ c語言中預處理命令都有哪些
C語言的預處理主要有三個方面的內容: 1.宏定義; 2.文件包含; 3.條件編譯。x0dx0a 預處理命令以符號「#」開頭。x0dx0ax0dx0a宏定義命令:#define、#undef,用來定義和解除宏。(值得注意的是還可以定義帶參數的宏)x0dx0ax0dx0a文件包含命令:#include "文件名" 或者 #include <文件名>。使用前者時會優先從當前目錄查找頭文件,使用後者時優先從默認的系統目錄查找。x0dx0ax0dx0a條件編譯:#ifdef、#else、#endif、#elif 等。出於程序兼容性的考慮,有些語句希望在條件滿足時才編譯。這時候會用到條件編譯的命令。
❺ 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。