欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

define的用法只是一種純粹的替換功能,宏定義的替換是預處理器處理的替換。

 一:簡單的宏定義用法

  格式:#define 標識符 替換內(nèi)容

  替換的內(nèi)容可以是數(shù)字,字符,字符串,特殊字符和空格,后面是什么內(nèi)容就會替換成什么內(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;];

  常見的一種錯誤:

  #define  pin  int*

  pin  a  , b ;     實際上的效果是    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ù)的宏定義的使用

 例子說話:一個求正方形面積的函數(shù)

  使用#define的正確寫法應該是:   

#include<stdio.h>
#define area(x)  ((x)*(x))
int main(void)
{
 int s = area(3 + 3);
 printf("s = %d\n" , s);
 return 0;
}

運行結(jié)果:(3+3)*(3+3)= 36  是我們想要的結(jié)果

  常見問題寫成:

#include<stdio.h>
#define area(x)  x*x
int main(void)
{
 int s = area(3 + 3);
 printf("s = %d\n" , s);
 return 0;
}

運行結(jié)果:3 + 3 * 3 + 3 = 15   不是我們想要的結(jié)果

這更能體現(xiàn)出前面說的define的宏定義就是純粹的一種替換,做的是先替換后計算的工作。

防止這種問題的方法:

   要想能夠真正使用好宏定義,防止出現(xiàn)上面一二兩種常用情況的一些錯誤,一定要記住在思路上先將程序中對宏的使用全部替換成它所代表的字符串,不要自作主張地添加任何其他符號,完全展開后再進行相應的計算,就不會寫錯運行結(jié)果。在編程使用宏替換時,當字符串中不只一個符號時,加上括號表現(xiàn)出優(yōu)先級,如果是帶參數(shù)的宏定義,則要給宏體中的每個參數(shù)加上括號,并在整個宏體上再加一個括號。

三:常用作對函數(shù)的封裝

例子說話:現(xiàn)在原有一個求兩個數(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)在需要不同的兩個功能函數(shù),一個是求正方形面積的函數(shù) square_area和一個求長方形的面積的函數(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);              /*兩個數(shù)字相乘的函數(shù)的聲明*/

#define square_area(str , x) mult(x , x)     /*封裝成一個求正方形面積的函數(shù)*/
#define rectangle_area(str , x , y) mult(x , y)  /*封裝成一個求長方形面積的函數(shù)*/

/*上面那些函數(shù)聲明和宏定義按照比較規(guī)范的書寫,本來應該放在一個頭文件里面的,這里為了說明問題就簡單放在函數(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;
}

運行結(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中的三個特殊符號:#,##,#@

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示x連接y,舉例說:
int n = Conn(123,456);   結(jié)果就是n=123456;
char* str = Conn("asdf", "adf")結(jié)果就是 str = "asdfadf";

#@x,其實就是給x加上單引號,結(jié)果返回是一個const char。舉例說:
char a = ToChar(1);結(jié)果就是a='1';
做個越界試驗char a = ToChar(123);結(jié)果就錯了;
但是如果你的參數(shù)超過四個字符,編譯器就給給你報錯了!error C2015: too many characters in constant   :P

#x,表示給x加雙引號
char* str = ToString(123132);就成了str="123132";

五:小結(jié)#define宏定義

(1)   方便程序的修改
      使用簡單宏定義可用宏代替一個在程序中經(jīng)常使用的常量,這樣在將該常量改變時,不用對整個程序進行修改,只修改宏定義的字符串即可,而且當常量比較長時, 我們可以用較短的有意義的標識符來寫程序,這樣更方便一些。

(2)  宏定義是在預編譯的時候就進行替換。程序中調(diào)用子函數(shù)執(zhí)行完之后都必須飯后調(diào)用該子函數(shù)的現(xiàn)場繼續(xù)往下執(zhí)行,這樣就會出現(xiàn)了函數(shù)轉(zhuǎn)換的消耗。但是使用帶參數(shù)的宏定義就不會出現(xiàn)這個問題,因為它是在預處理階段即進行了宏展開,在執(zhí)行時不需要轉(zhuǎn)換,即在當?shù)貓?zhí)行,但復雜的操作還是要由函數(shù)調(diào)用來完成,而且宏定義所占用的目標代碼空間相對較大。所以在使用時要依據(jù)具體情況來決定是否使用宏定義。

相關文章

  • C++詳解非類型模板參數(shù)Nontype與Template及Parameters的使用

    C++詳解非類型模板參數(shù)Nontype與Template及Parameters的使用

    除了類型可以作為模板參數(shù),普通值也可以作為模板函數(shù),即非類型模板參數(shù)(Nontype Template Parameters)。下面讓我們一起了解一下
    2022-06-06
  • C語言指針詳解之野指針

    C語言指針詳解之野指針

    這篇文章主要為大家介紹了C語言野指針,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • c語言定時器示例分享

    c語言定時器示例分享

    在linux下開發(fā),使用的是C語言。適用于需要定時的軟件開發(fā),以系統(tǒng)真實的時間來計算,它送出SIGALRM信號。每隔一秒定時一次
    2014-04-04
  • C語言實現(xiàn)簡單三子棋小游戲

    C語言實現(xiàn)簡單三子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單三子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言實現(xiàn)音樂播放器的示例代碼

    C語言實現(xiàn)音樂播放器的示例代碼

    這篇文章主要和大家分享了一個C語言的小DEMO,可以實現(xiàn)音樂播放器功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • C指針原理教程之C指針基礎

    C指針原理教程之C指針基礎

    指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。要搞清一個指針需要搞清指針的四方面的內(nèi)容:指針的類型、指針所指向的類型、指針的值或者叫指針所指向的內(nèi)存區(qū)、指針本身所占據(jù)的內(nèi)存區(qū)。
    2019-02-02
  • 簡要對比C語言中的setgid()函數(shù)和setregid()函數(shù)

    簡要對比C語言中的setgid()函數(shù)和setregid()函數(shù)

    這篇文章主要介紹了C語言中的setgid()函數(shù)和setregid()函數(shù)的簡要對比,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • php正則表達式的基本語法總結(jié)

    php正則表達式的基本語法總結(jié)

    以下是對php正則表達式的基本語法進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下
    2013-10-10
  • 詳解OpenMP的線程同步機制

    詳解OpenMP的線程同步機制

    在本篇文章當中主要給大家介紹?OpenMP?當中線程的同步和互斥機制,在?OpenMP?當中主要有三種不同的線程之間的互斥方式。下面就來和大家來討論一下OpenMP當中的互斥操作,需要的可以參考一下
    2023-01-01
  • C++中getline()和get()的方法淺析

    C++中getline()和get()的方法淺析

    大家都知道作為C++獲取輸入流的方法,幾乎在任何一本資料書上getline()方法和get()方法都作為入門級的方法進行講述,即便如此,筆者在學習C++的過程中仍經(jīng)常忘記這二者的使用要點,可能也有C++的初學者對這兩個方法還心存疑慮,本篇文章就這兩個方法的使用進行簡要闡述。
    2016-10-10

最新評論