define const enum的用法及區別

2021-08-08 19:32:27 字數 2711 閱讀 1923

define,無參巨集定義的一般形式為:#define 識別符號 字串(例:#define max 10)。define函式定義乙個常量。常量類似變數,不同之處在於:在設定以後,常量的值無法更改。常量值只能是字串或者數字。

①被定義為「巨集」的識別符號稱為「巨集名」。在編譯處理時,對程式中所有出現的「巨集名」,都用巨集定義中的字串去替代,這稱為「巨集代替」。巨集定義是由源程式中的巨集定義命令完成的。巨集代替是由預處理程式自動完成的。而巨集定義的作用範圍僅限於當前檔案。

②巨集定義有幾個優點:一、方便程式的修改  使用簡單巨集定義可用巨集代替乙個在程式中經常使用的常量,這樣在將該常量改變時,不用對整個程式進行修改,只修改巨集定義的字串即可。二、提高計算機的執行效率   使用帶引數的巨集定義可以完成函式調動的功能,又能減少系統開銷,提高執行效率。

③對於巨集定義還有幾點說明:一、巨集定義是用巨集名來表示乙個字串,在巨集展開時又是以該字串取代巨集名,者之死一種簡單的替換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式不會對它作檢查。如果有錯誤,只能在編譯已經被巨集展開後的源程式時發現。二、巨集定義不是說明或者語句,在行末不必增加分號,如加上分號則連分號也一起置換。三、巨集定義其作用域為巨集定義命令起到源程式結束。如果終止其作用域可使用#undef命令。

const,它是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性,另外,在**別人**的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。關於const的用法總結以下幾點:

①函式體內修飾區域性變數

例:void main()

const作為乙個型別限定詞,和int有著相同的地位。const int a;//int const a;是等價的。於是在此處我們應該知道const修飾的物件是誰,是a,和int沒關係。const要求他的物件為常量,不可被改變,不可被賦值,不可為左值。

②在函式宣告時修飾引數

根據常量指標與指標常量,const修飾函式的引數也是分為三種情況

1、防止修改指標指向的內容

void stringcopy(char *strdestination, const char *strsource);

其中 strsource 是輸入引數,strdestination 是輸出引數。給 strsource 加上 const 修飾後,如果函式體內的語句試圖改動 strsource 的內容,編譯器將指出錯誤。

2、防止修改指標指向的位址

void swap ( int * const p1 , int * const p2 )

指標p1和指標p2指向的位址都不能修改。

3、以上兩種的結合。

③修飾函式的返回值

如果給以「指標傳遞」方式的函式返回值加 const 修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。

例:const char * getstring(void);

如下語句將出現編譯錯誤:

char *str = getstring();

正確的用法是

const char *str = getstring();

④全域性變數

使用extern(extern是計算機語言中的乙個函式,可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中。提示編譯器遇到此變數或函式時,在其它模組中尋找其定義,另外,extern也可用來進行鏈結指定。)

例:extern const double pi;

const double pi=3.14;

然後其他需要使用pi這個變數的,包含file1.h   #include "file.h"或者複製宣告。

const 的好處,是引入了常量的概念,讓我們不要去修改不該修改的記憶體。直接的作用就是讓更多的邏輯錯誤在編譯期被發現。

enum,列舉型別是一種基本資料型別,定義一般為:enum 列舉名;在列舉值表中應羅列出所有可用值。這些值也被稱為列舉元素。

①列舉的定義,列舉值是常量,不是變數。不能再程式中用賦值語句在對它賦值。

第一種定義為:

enum box;  

enum box box2;//或者簡寫成box box2;  

再有一種就是在宣告的時候同時定義。

enum box,box2; //在宣告的同時進行定義!

如果直接enum box;};//這裡pen就是4系統將自動進行pen=4的定義賦值操作。

又如果你不進行元素賦值操作那麼元素將會被系統自動從0開始自動遞增的進行賦值操作

②列舉元素本身由系統定義了乙個表示序號的值,從0開始順序定義為0,1,2,,,。如在weekday中,sun值為0,mon值為1,…,sat值為6。

例:void   main()

a,b,c;

a=sun;

b=mon;

c=tue;

printf("%d,%d,%d",a,b,c);}

說明:只能把列舉值賦予列舉變數,不能把元素的數值直接賦予列舉變數。如:

a=sum;

b=mon;

是正確的。而:

a=0;

b=1;

是錯誤的。如一定要把數值賦予列舉變數,則必須用強制型別轉換。

如:a=(enum weekday)2;

其意義是將順序號為2的列舉元素賦予列舉變數a,相當於:

a=tue;

還應該說明的是列舉元素不是字元常量也不是字串常量,使用時不要加單、雙引號。

Handler AsyncTask用法及區別

handler和asynctask都是為了android中的非同步處理方式,避免在子執行緒操作ui造成anr異常下面分別介紹 handler主要接收子執行緒傳送的資料,並用此資料配合主線程更新ui,用來跟ui主線程互動用。比如用hanlder傳送乙個message,然後在handler的執行緒中來接...

define的用法及與typedef的區別

1 define 無引數巨集定義 用法 一般形式為 define 識別符號 字串 1 表示其為預處理命令,凡是以 開頭的都是預處理命令 define 為巨集定義命令 識別符號 為所定義的巨集名 字串 可以是常數 表示式 字串等。2 除了經常用到的如 define maxnum 100 之外,還有其它...

define const enum 三者的區別

define define函式定義乙個常量 設定後常量值無法更改 只能是字串或者數字 無參巨集定義 denfine 巨集名 字串 其中的 表示這是一條預處理命令。凡是以它開頭的均為預處理命令 define為巨集定義命令。識別符號為所定義的巨集名。方便程式修改 提高程式執行效率 const 它是乙個關...