亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Linux c中define的用法小結

2020-01-26 14:45:49
字體:
來源:轉載
供稿:網友

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

 一:簡單的宏定義用法

  格式:#define 標識符 替換內容

  替換的內容可以是數字,字符,字符串,特殊字符和空格,后面是什么內容就會替換成什么內容。

  例如:

  #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 );  }

  結果是2+2*2+2=8

 二:帶參數的宏定義的使用

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

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

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

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

  常見問題寫成:

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

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

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

防止這種問題的方法:

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

三:常用作對函數的封裝

例子說話:現在原有一個求兩個數乘積的函數mult 

[Linux@centos-64-min exercise]$ cat mul.c #include <stdio.h>int mult(int x , int y ){   int result = x * y;   return result;}

現在需要不同的兩個功能函數,一個是求正方形面積的函數 square_area和一個求長方形的面積的函數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);              /*兩個數字相乘的函數的聲明*/#define square_area(str , x) mult(x , x)     /*封裝成一個求正方形面積的函數*/#define rectangle_area(str , x , y) mult(x , y)  /*封裝成一個求長方形面積的函數*//*上面那些函數聲明和宏定義按照比較規范的書寫,本來應該放在一個頭文件里面的,這里為了說明問題就簡單放在函數里了*/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;}

運行結果:

[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);   結果就是n=123456;
char* str = Conn("asdf", "adf")結果就是 str = "asdfadf";

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

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

五:小結#define宏定義

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.亚洲一区| 日本sm极度另类视频| 亚洲图片在区色| 久久99热精品| 精品久久久香蕉免费精品视频| 国产精品扒开腿做爽爽爽视频| 最好看的2019年中文视频| 国产欧美日韩综合精品| 国产亚洲视频中文字幕视频| 日本高清视频精品| 亚洲视频电影图片偷拍一区| www.99久久热国产日韩欧美.com| 国产精品中文久久久久久久| 国产欧美一区二区三区久久| 色偷偷av一区二区三区| 欧美华人在线视频| 亚洲国产成人91精品| 最近中文字幕2019免费| 日韩一区二区精品视频| 国产免费一区视频观看免费| 亚洲成人性视频| 在线观看精品国产视频| 欧美性视频在线| 久久亚洲精品毛片| 国产婷婷97碰碰久久人人蜜臀| 欧美激情三级免费| 久久综合五月天| 久久久精品在线观看| 日本久久精品视频| 欧美做爰性生交视频| 久久99视频精品| 美日韩精品视频免费看| 伊人久久久久久久久久久久久| 亚洲无限乱码一二三四麻| 欧美日韩加勒比精品一区| 亚洲第一页自拍| 精品成人国产在线观看男人呻吟| 国内久久久精品| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩亚洲精品内裤| 中文国产成人精品| 91精品国产综合久久男男| 亚洲热线99精品视频| 久久久中精品2020中文| 欧美第一黄网免费网站| 亚洲一区二区免费| 亚洲天堂av高清| 中文字幕欧美在线| 91免费看视频.| 亚洲精品wwww| 国产欧美在线观看| 日韩有码在线观看| 欧美乱人伦中文字幕在线| 日韩电视剧在线观看免费网站| 亚洲欧美日韩区| 欧美一级视频免费在线观看| 国产精品高精视频免费| 亚洲国产精品久久久久久| 粗暴蹂躏中文一区二区三区| 国产精品久久久久不卡| 日韩av综合中文字幕| 欧亚精品在线观看| 国产香蕉97碰碰久久人人| 欧美性jizz18性欧美| 91高清免费视频| 97婷婷大伊香蕉精品视频| 最近2019中文免费高清视频观看www99| 成人写真福利网| 51久久精品夜色国产麻豆| 久久亚洲国产精品成人av秋霞| 欧美成人一区在线| 欧美极品在线视频| 国产精品男女猛烈高潮激情| 国产一区视频在线播放| 久久免费少妇高潮久久精品99| 中文字幕无线精品亚洲乱码一区| 日本国产欧美一区二区三区| 久久久久久久久国产| 日韩hd视频在线观看| 国产精品视频最多的网站| 久久精品亚洲94久久精品| 韩国视频理论视频久久| 92版电视剧仙鹤神针在线观看| 久久久久久国产精品| 插插插亚洲综合网| 成人中文字幕+乱码+中文字幕| 欧美视频免费在线观看| 亚洲精美色品网站| 亚洲国产精品资源| 亚洲精品第一国产综合精品| 亚洲欧洲激情在线| 国产在线观看精品一区二区三区| 亚洲日本成人女熟在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 欧美性生交大片免网| 国产一区香蕉久久| 欧美成人激情在线| 欧美韩日一区二区| 最近2019年中文视频免费在线观看| 国内精品久久久久久影视8| 国产午夜精品全部视频播放| 中文字幕国产亚洲2019| 国产成人一区二| 欧美人在线观看| 亚洲欧美三级伦理| 欧美激情精品久久久久久黑人| 亚洲最大成人在线| 久久久亚洲天堂| 欧洲美女免费图片一区| 日韩av观看网址| 亚洲人a成www在线影院| 国产精品户外野外| 久久视频在线看| 亚洲国产精彩中文乱码av| 韩国19禁主播vip福利视频| 亚洲第一级黄色片| 日本三级韩国三级久久| 亚洲欧洲激情在线| 亚洲一区二区三区四区在线播放| 国产999在线观看| 自拍偷拍亚洲一区| 亚洲欧美日韩第一区| 亚洲精品电影网在线观看| 国产精品网站入口| 亚洲综合中文字幕在线观看| 亚洲天堂av女优| 国产精品福利在线观看网址| 国产欧美日韩中文字幕| 精品亚洲男同gayvideo网站| 在线精品91av| 国产精品日韩欧美| 另类色图亚洲色图| 亚洲欧美综合精品久久成人| 国产日韩欧美中文| 欧美激情视频免费观看| 国模精品一区二区三区色天香| 91经典在线视频| 亚洲人成在线一二| 免费97视频在线精品国自产拍| 欧美一区深夜视频| 亚洲成人黄色在线观看| 国产一区二区三区在线免费观看| 亚洲欧美国产精品久久久久久久| 国产成一区二区| 国产日韩精品电影| 日韩免费在线视频| 伊人亚洲福利一区二区三区| 国外成人性视频| 日本午夜精品理论片a级appf发布| 日韩欧美亚洲国产一区| 亚洲区一区二区| 中文字幕日韩在线观看| 欧美一区二区三区……| 欧美精品www| 91精品国产综合久久香蕉最新版| 欧美大尺度在线观看| 国产一区二区久久精品| 亚洲国产精品成人av| 久久久久久999| 久久久免费精品| 日韩在线观看免费全集电视剧网站| 国产精品福利无圣光在线一区| 日韩中文字幕欧美| 九九热精品视频在线播放|