最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux c中define的用法小結(jié)

 更新時(shí)間:2016年01月17日 11:04:53   投稿:hebedich  
學(xué)習(xí)了這么多年C語(yǔ)言,說(shuō)實(shí)話對(duì)宏自以為了如指掌了,沒(méi)想到看內(nèi)核代碼的時(shí)候還是那么吃力,設(shè)備驅(qū)動(dòng)代碼中有很多這樣或者那樣的宏定義,各種define,在學(xué)習(xí)的過(guò)程中將C語(yǔ)言中所出現(xiàn)的#define定義整理總結(jié)了一下,供大家借鑒和學(xué)習(xí)。

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的正確寫法應(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)題寫成:

#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ì)寫錯(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。

可以這樣寫:

[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ī)范的書寫,本來(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)寫程序,這樣更方便一些。

(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)決定是否使用宏定義。

相關(guān)文章

  • C++類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)示例

    C++類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)示例

    類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換是面向?qū)ο缶幊讨刑幚眍愋椭g轉(zhuǎn)換的兩種重要機(jī)制,本文就來(lái)介紹一下這兩種方法的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • 解決Qt設(shè)置QTextEdit行高的問(wèn)題

    解決Qt設(shè)置QTextEdit行高的問(wèn)題

    這篇文章介紹了Qt設(shè)置QTextEdit行高的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++利用socket傳輸大文件的實(shí)現(xiàn)代碼

    C++利用socket傳輸大文件的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket傳輸大文件的實(shí)現(xiàn)代碼,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-10-10
  • C++內(nèi)存泄漏的檢測(cè)與實(shí)現(xiàn)詳細(xì)流程

    C++內(nèi)存泄漏的檢測(cè)與實(shí)現(xiàn)詳細(xì)流程

    內(nèi)存泄漏(memory leak) 是指由于疏忽或錯(cuò)誤造成了程序未能釋放掉不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)
    2022-08-08
  • sqlserver,sqlite,access數(shù)據(jù)庫(kù)鏈接字符串整理

    sqlserver,sqlite,access數(shù)據(jù)庫(kù)鏈接字符串整理

    本節(jié)主要整理sqlserver,sqlite,access數(shù)據(jù)庫(kù)鏈接字符串,有需要的朋友可以參考下
    2014-07-07
  • C++使用數(shù)組來(lái)實(shí)現(xiàn)哈夫曼樹(shù)

    C++使用數(shù)組來(lái)實(shí)現(xiàn)哈夫曼樹(shù)

    給定N個(gè)權(quán)值作為N個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹(shù),若該樹(shù)的帶權(quán)路徑長(zhǎng)度達(dá)到最小,稱這樣的二叉樹(shù)為最優(yōu)二叉樹(shù),也稱為哈夫曼樹(shù)(Huffman?Tree)。哈夫曼樹(shù)是帶權(quán)路徑長(zhǎng)度最短的樹(shù),權(quán)值較大的結(jié)點(diǎn)離根較近
    2022-05-05
  • C語(yǔ)言中結(jié)構(gòu)體和共用體實(shí)例教程

    C語(yǔ)言中結(jié)構(gòu)體和共用體實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中結(jié)構(gòu)體和共用體的相關(guān)資料,結(jié)構(gòu)體是一種自定義的復(fù)合數(shù)據(jù)類型,共用體也叫聯(lián)合體,使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋),需要的朋友可以參考下
    2021-06-06
  • C語(yǔ)言字符串函數(shù)入門

    C語(yǔ)言字符串函數(shù)入門

    這篇文章主要為大家介紹了C語(yǔ)言字符串函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C語(yǔ)言 while語(yǔ)句的用法詳解

    C語(yǔ)言 while語(yǔ)句的用法詳解

    本文主要介紹C語(yǔ)言while 語(yǔ)句,這里對(duì)while 循環(huán)做詳細(xì)講解,并提供示例代碼,希望能幫助學(xué)習(xí)C語(yǔ)言的同學(xué)
    2016-07-07
  • C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解

    C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-12-12

最新評(píng)論

礼泉县| 张家口市| 竹溪县| 石门县| 牡丹江市| 威海市| 台北县| 芜湖市| 林州市| 德阳市| 胶州市| 兖州市| 商城县| 普陀区| 东城区| 加查县| 郁南县| 富顺县| 江山市| 玛纳斯县| 河东区| 大渡口区| 城市| 长丰县| 兴文县| 达拉特旗| 玉林市| 辽宁省| 湛江市| 南华县| 屏南县| 穆棱市| 延津县| 谷城县| 越西县| 浮山县| 稻城县| 综艺| 宁晋县| 喀喇沁旗| 辽阳县|