Linux c中define的用法小結(jié)
define的用法只是一種純粹的替換功能,宏定義的替換是預(yù)處理器處理的替換。
一:簡(jiǎn)單的宏定義用法
格式:#define 標(biāo)識(shí)符 替換內(nèi)容
替換的內(nèi)容可以是數(shù)字,字符,字符串,特殊字符和空格,后面是什么內(nèi)容就會(huì)替換成什么內(nèi)容。
例如:
#define N 5 效果等同于 int array [5];
int array[N];
同樣效果:
#define N = 5
int array[N]; 效果等同于 int array[= 5];
同樣效果:
#define N 5;
int array[N]; 效果等同于 int array[5;];
常見(jiàn)的一種錯(cuò)誤:
#define pin int*
pin a , b ; 實(shí)際上的效果是 int *a , b;
#define N 2+2 void main(void) { int a = N * N; printf("%d\n" , a ); }
結(jié)果是2+2*2+2=8
二:帶參數(shù)的宏定義的使用
例子說(shuō)話:一個(gè)求正方形面積的函數(shù)
使用#define的正確寫(xiě)法應(yīng)該是:
#include<stdio.h> #define area(x) ((x)*(x)) int main(void) { int s = area(3 + 3); printf("s = %d\n" , s); return 0; }
運(yùn)行結(jié)果:(3+3)*(3+3)= 36 是我們想要的結(jié)果
常見(jiàn)問(wèn)題寫(xiě)成:
#include<stdio.h> #define area(x) x*x int main(void) { int s = area(3 + 3); printf("s = %d\n" , s); return 0; }
運(yùn)行結(jié)果:3 + 3 * 3 + 3 = 15 不是我們想要的結(jié)果
這更能體現(xiàn)出前面說(shuō)的define的宏定義就是純粹的一種替換,做的是先替換后計(jì)算的工作。
防止這種問(wèn)題的方法:
要想能夠真正使用好宏定義,防止出現(xiàn)上面一二兩種常用情況的一些錯(cuò)誤,一定要記住在思路上先將程序中對(duì)宏的使用全部替換成它所代表的字符串,不要自作主張地添加任何其他符號(hào),完全展開(kāi)后再進(jìn)行相應(yīng)的計(jì)算,就不會(huì)寫(xiě)錯(cuò)運(yùn)行結(jié)果。在編程使用宏替換時(shí),當(dāng)字符串中不只一個(gè)符號(hào)時(shí),加上括號(hào)表現(xiàn)出優(yōu)先級(jí),如果是帶參數(shù)的宏定義,則要給宏體中的每個(gè)參數(shù)加上括號(hào),并在整個(gè)宏體上再加一個(gè)括號(hào)。
三:常用作對(duì)函數(shù)的封裝
例子說(shuō)話:現(xiàn)在原有一個(gè)求兩個(gè)數(shù)乘積的函數(shù)mult
[Linux@centos-64-min exercise]$ cat mul.c #include <stdio.h> int mult(int x , int y ) { int result = x * y; return result; }
現(xiàn)在需要不同的兩個(gè)功能函數(shù),一個(gè)是求正方形面積的函數(shù) square_area和一個(gè)求長(zhǎng)方形的面積的函數(shù)rectangle_area。
可以這樣寫(xiě):
[Linux@centos-64-min exercise]$ cat mul.c #include <stdio.h> int mult(int x , int y ) { int result = x * y; return result; } [Linux@centos-64-min exercise]$ cat try.c #include <stdio.h> int mult(int x , int y); /*兩個(gè)數(shù)字相乘的函數(shù)的聲明*/ #define square_area(str , x) mult(x , x) /*封裝成一個(gè)求正方形面積的函數(shù)*/ #define rectangle_area(str , x , y) mult(x , y) /*封裝成一個(gè)求長(zhǎng)方形面積的函數(shù)*/ /*上面那些函數(shù)聲明和宏定義按照比較規(guī)范的書(shū)寫(xiě),本來(lái)應(yīng)該放在一個(gè)頭文件里面的,這里為了說(shuō)明問(wèn)題就簡(jiǎn)單放在函數(shù)里了*/ int main(void) { int s = 0; s = square_area("This is the area of the square" , 3); printf("This is the area of the square : s = %d\n" , s); s = rectangle_area("This is the area of the rectangle" , 3 ,4); printf("This is the area of the rectangle : s = %d\n" , s); return 0; }
運(yùn)行結(jié)果:
[Linux@centos-64-min exercise]$ gcc -o try try.c mul.o
[Linux@centos-64-min exercise]$ ./try
This is the area of the square : s = 9
This is the area of the rectangle : s = 12
四:define中的三個(gè)特殊符號(hào):#,##,#@
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示x連接y,舉例說(shuō):
int n = Conn(123,456); 結(jié)果就是n=123456;
char* str = Conn("asdf", "adf")結(jié)果就是 str = "asdfadf";
#@x,其實(shí)就是給x加上單引號(hào),結(jié)果返回是一個(gè)const char。舉例說(shuō):
char a = ToChar(1);結(jié)果就是a='1';
做個(gè)越界試驗(yàn)char a = ToChar(123);結(jié)果就錯(cuò)了;
但是如果你的參數(shù)超過(guò)四個(gè)字符,編譯器就給給你報(bào)錯(cuò)了!error C2015: too many characters in constant :P
#x,表示給x加雙引號(hào)
char* str = ToString(123132);就成了str="123132";
五:小結(jié)#define宏定義
(1) 方便程序的修改
使用簡(jiǎn)單宏定義可用宏代替一個(gè)在程序中經(jīng)常使用的常量,這樣在將該常量改變時(shí),不用對(duì)整個(gè)程序進(jìn)行修改,只修改宏定義的字符串即可,而且當(dāng)常量比較長(zhǎng)時(shí), 我們可以用較短的有意義的標(biāo)識(shí)符來(lái)寫(xiě)程序,這樣更方便一些。
(2) 宏定義是在預(yù)編譯的時(shí)候就進(jìn)行替換。程序中調(diào)用子函數(shù)執(zhí)行完之后都必須飯后調(diào)用該子函數(shù)的現(xiàn)場(chǎng)繼續(xù)往下執(zhí)行,這樣就會(huì)出現(xiàn)了函數(shù)轉(zhuǎn)換的消耗。但是使用帶參數(shù)的宏定義就不會(huì)出現(xiàn)這個(gè)問(wèn)題,因?yàn)樗窃陬A(yù)處理階段即進(jìn)行了宏展開(kāi),在執(zhí)行時(shí)不需要轉(zhuǎn)換,即在當(dāng)?shù)貓?zhí)行,但復(fù)雜的操作還是要由函數(shù)調(diào)用來(lái)完成,而且宏定義所占用的目標(biāo)代碼空間相對(duì)較大。所以在使用時(shí)要依據(jù)具體情況來(lái)決定是否使用宏定義。
上一篇:C++中聲明類(lèi)的class與聲明結(jié)構(gòu)體的struct關(guān)鍵字詳解
欄 目:C語(yǔ)言
下一篇:詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員
本文標(biāo)題:Linux c中define的用法小結(jié)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2539.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery