⑴ 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。
⑵ 預處理命令都有哪些
凡是以"#"開頭的均為預處理命令
1. 第一種形式: #ifdef 標識符
程序段1
#else
程序段2
#endif
它的功能是,如果標識符已被 #define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯.
2. 第二種形式:
#ifndef 標識符
程序段1
#else
程序段2
#endif
與第一種形式的區別是將"ifdef"改為"ifndef".它的功能是,如果標識符未被#define命令定義過則對程序段1進行編譯, 否則對程序段2進行編譯.這與第一種形式的功能正相反.
3. 第三種形式:
#if 常量表達式
程序段1
#else
程序段2
#endif
⑶ c語言中預處理命令都有哪些
C語言的預處理主要有三個方面的內容: 1.宏定義; 2.文件包含; 3.條件編譯。x0dx0a 預處理命令以符號「#」開頭。x0dx0ax0dx0a宏定義命令:#define、#undef,用來定義和解除宏。(值得注意的是還可以定義帶參數的宏)x0dx0ax0dx0a文件包含命令:#include "文件名" 或者 #include <文件名>。使用前者時會優先從當前目錄查找頭文件,使用後者時優先從默認的系統目錄查找。x0dx0ax0dx0a條件編譯:#ifdef、#else、#endif、#elif 等。出於程序兼容性的考慮,有些語句希望在條件滿足時才編譯。這時候會用到條件編譯的命令。
⑷ 單片機C語言編程,要使用C語言自帶的庫函數,使用哪個宏包含命令
使用#include調用庫函數。
C51語言的編譯器中包含有豐富的庫函數,使用庫函數可以大大簡化用戶程序設計的工作量,提高編程效率。每個庫函數都在相應的頭文件中給出了函數原型聲明,在使用時,必須在源程序的開始處使用預處理命令#include將有關的頭文件包含進來。
C51庫函數中類型的選擇考慮到了8051單片機的結構特性,用戶在自己的應用程序中應盡可能地使用最小的數據類型,以最大限度地發揮8051單片機的性能,同時可減少應用程序的代碼長度。
單片機c語言編程是基於C語言的單片機編程。單片機的C語言採用C51編譯器(簡稱C51)。由C51產生的目標代碼短,運行速度高,存儲空間小,符合C語言的ANSI標准,生成的代碼遵循Intel目標文件格式,而且可與A51匯編語言PL/M51語言目標代碼混合使用。51單片機支持三種高級語言,即PL/M,C和BASIC。C語言是一種通用的程序設計語言,其代碼率高,數據類型及運算符豐富,並具有良好的程序結構,適用於各種應用的程序設計,是使用較廣的單片機編程語言。