語言深入講解-第1章編譯預(yù)處理_第1頁
語言深入講解-第1章編譯預(yù)處理_第2頁
語言深入講解-第1章編譯預(yù)處理_第3頁
語言深入講解-第1章編譯預(yù)處理_第4頁
語言深入講解-第1章編譯預(yù)處理_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

嵌入式C語言高級(jí)編程篇課程地位課程目標(biāo)了解嵌入式C語言編程特點(diǎn)和操作細(xì)節(jié)結(jié)合嵌入式環(huán)境深入理解指針、數(shù)組和函數(shù)提高編程實(shí)踐和編程程序規(guī)范理解熟悉C語言標(biāo)準(zhǔn)庫應(yīng)用和特點(diǎn)課程結(jié)構(gòu)圖基礎(chǔ)知識(shí)C語言深入程序規(guī)范熟悉宏定義、嵌入式位操作,初步理解數(shù)據(jù)結(jié)構(gòu),同時(shí)進(jìn)一步講述C編程特點(diǎn)、調(diào)試和解錯(cuò)(第1-2章)詳細(xì)講述數(shù)據(jù)結(jié)構(gòu):鏈表、樹、哈希表和常用的排序算法(第3-7章)了解C語言高級(jí)編程規(guī)范,提高程序編程健壯行熟悉嵌入式編程特點(diǎn)(第8-9章)編譯預(yù)處理

第一章本章目標(biāo)本章概述講述宏定義的標(biāo)準(zhǔn)用法了解預(yù)編譯的概念,掌握宏定義的方法。了解“文件包含”與預(yù)處理的應(yīng)用。了解條件編譯的幾種形式。本章目標(biāo)了解一些C語言特殊的宏定義重點(diǎn)

宏定義操作本章結(jié)構(gòu)編譯預(yù)處理編譯預(yù)處理和位運(yùn)算文件包含宏定義條件編譯預(yù)處理其他關(guān)鍵詞1編譯預(yù)處理與位運(yùn)算編譯預(yù)處理宏定義文件包含條件編譯其他預(yù)處理關(guān)鍵字1.1編譯預(yù)處理作用:對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C源程序種類宏定義#define文件包含#include條件編譯#if--#else--#endif等其他宏定義#line#error#pragma格式:“#”開頭占單獨(dú)書寫行語句尾不加分號(hào)1.2宏定義#undef無參數(shù)宏定義有參數(shù)宏定義1.2.1#undef

#undef定義指令刪除前面定義的宏名字。表達(dá)一般形式為:#undefmacro-name例子#defineMICRO1#undefMICRO1.2.2無參數(shù)宏定義如if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展開后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);不帶參數(shù)宏定義一般形式:#define宏名[宏體]功能:用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏體可缺省,表示宏名定義過或取消宏體例#defineMAXMAX+10()例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展開:printf(“2*PI=%f\n”,3.14159*2);例#defineWIDTH80#defineLENGTH

WIDTH+40var=LENGTH*2;宏展開:var=80+40*2;()()例#defineWIDTH80#defineLENGTH

WIDTH+40var=LENGTH*2;宏展開:var=80+40*2;1.2.2不帶參數(shù)宏定義宏定義的規(guī)則宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別宏定義不是C語句,不必在行末加分號(hào)在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層替換。只作字符替換,不分配內(nèi)存空間。#defineR3.0#definePI3.1415926#defineL(2*(PI)*(R))#defineS(PI)*(R)*(R))main(){ printf(“L=%f\nS=%f\n”,L,S);}結(jié)果:

L=18.849556S=28.2743331.2.2不帶參數(shù)宏定義宏定義的特點(diǎn)宏名一般習(xí)慣用大寫字母表示提高程序的通用性宏名的有效范圍為定義命令之后到本源文件結(jié)束可以用#undef命令終止宏定義的作用域宏定義只作簡單的替換,不作正確性檢查1.2.3帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)宏體例#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)PI*r*r”宏展開:形參用實(shí)參換,其它字符保留宏體及各形參之間應(yīng)加空格注意宏體的括號(hào)例#defineS(a,b)a*b………..area=S(3,2);宏展開:area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開:z=((x+y)*(x+y));1.2.3帶參數(shù)宏定義帶參數(shù)宏定義的特點(diǎn)帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)例如:#defineS(a,b)a*b寫為:#defineS(a,b)a*b將被認(rèn)為是無參宏定義,宏名S代表字符串(a,b)a*b在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因此不必作類型定義在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來以避免出錯(cuò)

#defineSQ(y)((y)*(y))main(){ inta,sq; printf("inputanumber:"); scanf("%d",&a); sq=SQ(a+1); printf("sq=%d\n",sq);}1.2.3帶參數(shù)宏定義帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同帶參宏函數(shù)處理過程不分配內(nèi)存簡單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類型無類型問題定義實(shí)參,形參類型程序長度變長不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間1.2.3帶參數(shù)宏定義帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同宏定義例函數(shù)例main(){inti=1;while(i<=5)printf("%d\n",SQ(i++));}SQ(inty){

return((y)*(y));}#defineSQ(y)((y)*(y))main(){

inti=1;

while(i<=5)

printf("%d\n",SQ(i++));}1.2.3宏與函數(shù)參數(shù)的類型不定#defineMAX(a,b)(a>b)?a:b有些宏參數(shù)不能作為函數(shù)參數(shù)#defineMALLOC(n,type)\

((type*)malloc((n)*sizeof(type))

)……pi=MALLOC(25,int)1.2.3宏與命令行參數(shù)同一源文件,編譯不同版本時(shí):intarray[ARRAY_SIZE];編譯時(shí):gcc-DARRAY_SIZEfilename.c-ofilenamegcc-DARRAY_SIZE=10filename.c-ofilename注:在文件中不能用define重復(fù)宏定義

-Uname刪除符號(hào)定義1.3文件包含函數(shù)例功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA處理過程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯<>直接按標(biāo)準(zhǔn)目錄搜索“”先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄1.3文件包含被包含文件內(nèi)容源文件(*.c)頭文件(*.h)宏定義數(shù)據(jù)結(jié)構(gòu)定義函數(shù)說明等文件包含可嵌套#include“file2.h”file1.cAfile3.hC#include“file3.h”file2.h

Bfile1.cAfile3.hfile2.h1.3文件包含例子/*powers.h*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))#include<stdio.h>#include"powers.h"#defineMAX_POWER10voidmain(){intn;printf("number\texp2\texp3\texp4\n");printf("----\t----\t-----\t------\n");for(n=1;n<=MAX_POWER;n++)printf("%2d\t%3d\t%4d\t%5d\n",n,sqr(n),cube(n),quad(n));}1.3文件包含文件包含特點(diǎn)一個(gè)include命令只能指定一個(gè)被包含文件可以用雙引號(hào)括起來,也可以用尖括號(hào)括起來。文件包含允許嵌套被包含文件(file2.h)與其所在的文件(file.c)在預(yù)編譯之后已成為同一個(gè)文件1.4條件編譯#if、#else、#elif#endif#ifdef和#ifndef1.4.1#if、#else、#elif#endif條件編譯指令中最常用的或許是#if,#else,#elif和#endif#if的一般形式是:#ifconstant-expression

Statementsequence#endif#endif標(biāo)記#if塊的結(jié)束

注:constant-expression必須為常量表達(dá)式:字面值常量

#define定義的符號(hào)1.4.1#if、#else、#elif#endif#else指令的作用與C語言的else相似,#if指令失敗時(shí)它可以作為備選指令#else既是標(biāo)記#if塊的結(jié)束,也標(biāo)記#else塊的開始

每個(gè)#if只能寫一個(gè)#endif匹配例子:#include<stdio.h>#defineMAX100Intmain(void){

#ifMAX>99

printf(“Compiledforarraygreaterthan99.\n”);

#else

printf(“Compliedforsmallarray.\n”);

#endif

return0;}1.4.1#if、#else、#elif#endif#elif指令的意思是“否則,如果”語法格式:#ifexpression

Statementsequence#elifexpression1

Statementsequence#elifexpression2

。。。。。。#elifexpression

Statementsequence#endif

1.4.2#ifdef和#ifndef#ifdef--如果已定義#ifdef的一般形式如下:#ifdef標(biāo)識(shí)符程序段1#else

程序段2#endif當(dāng)所指定的標(biāo)識(shí)符已經(jīng)被#define命令定義過,則在程序編譯階段只編譯程序段1,否則編譯程序段2。例子:#ifdefCOMPUTER_A #defineINTEGER_SIZE16#else #defineINTEGER_SIZE32#endif1.4.2#ifdef和#ifndef#ifndef--如果已定義#ifdef的一般形式如下:#ifndef標(biāo)識(shí)符程序段1#else

程序段2#endif作用是當(dāng)所指定的標(biāo)識(shí)符未被#define命令定義過,則在程序編譯階段只編譯程序段1,否則編譯程序段2。它只是第一行與第一種形式不同。這種形式與第一種形式的作用相反#ifndef1.4.2#ifdef和#ifndef#ifdef和#ifndef#inlucde<stdio.h>#defineT10intmain(void){

#ifdeft

Printf(“HiT\n”);

#else

Printf(“Hianyone\n”);

#endif

#ifndefM

Printf(“MNotDefined\n”);

#endif

return0;}1.4.2#ifdef和#ifndef#if--如果已定義#if的一般形式如下:#if常量表達(dá)式 程序段1#else 程序段2#endif如常量表達(dá)式的值為真(非0),則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯1.4.2#ifdef和#ifndef#if例子#defineR1main(){

floatc,r,s;

printf("inputanumber:");

scanf("%f",&c);

#ifR

r=3.14159*c*c;

printf("areaofroundis:%f\n",r);

#else

s=c*c;

printf("areaofsquareis:%f\n",s);

#endif}階段小節(jié)宏定義的特點(diǎn)和宏定義的取消帶參數(shù)宏定義要注意的幾個(gè)細(xì)節(jié)條件編譯主要應(yīng)用在那幾個(gè)方面,它有幾種使用方法Include包含文件的兩種方法和他們之間的區(qū)別特點(diǎn)1.5.6預(yù)定義宏__DATE__進(jìn)行預(yù)處理的日期(“Mmmddyyyy”形式的字符串文字)__FILE__代表當(dāng)前源代碼文件名的字符串文字__LINE__代表當(dāng)前源代碼中的行號(hào)的整數(shù)常量__

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論