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)
結果是2+2*2+2=8
二:帶引數的巨集定義的使用
例子說話:乙個求正方形面積的函式
使用#define的正確寫法應該是:
#include
#define ayrpfrmnrrea(x) ((x)*(x))
int main(void)
執行結果:(3+3)*(3+3)= 36 是我們想要的結果
常見問題寫成:
#include
#define area(x) x*x
int main(void)
執行結果:3 + 3 * 3 + 3 = 15 不是我們想要的結果
這更能體現出前面說的define的巨集定義就是純粹的一種替換,做的是先替換後計算的工作。
防止這種問題的方法:
要想能夠真正使用好巨集定義,防止出現上面一二兩種常用情況的一些錯誤,一定要記住在思路上先將程式中對巨集的使用全部替換成它所代表的字串,不要自作主張地新增任何其他符號,完全展開後再進行相應的計算,就不會寫錯執行結果。在程式設計使用巨集替換時,當字串中不只乙個符號時,加上括號表現出優先順序,如果是帶引數的巨集定義,則要給巨集體中的每個引數加上括號,並在整個巨集體上再加乙個括號。
三:常用作對函式的封裝
例子說話:現在原有乙個求兩個數乘積的函式mult
[linux@centos-64-min exercise]$ cat mul.c
#include
int mult(int x , int y )
現在需要不同的兩個功能函式,乙個是求正方形面積的函式 square_area和乙個求長方形的面積的函式rectangle_area。
可以這樣寫:
[linux@centos-64-min exercise]$ cat mul.c
#include
int mult(int x , int y )
[linux@centos-64-min exercise]$ cat try.c
#include
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)
執行結果:
[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); &nb程式設計客棧sp; 結果就是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) 方便程式的修改
使用簡單yrpfrmnr巨集定義可用巨集代替乙個在程式中經常使用的常量,這樣在將該常量改變時,不用對整個程式進行修改,只修改巨集定義的字串即可,而且當常量比較長時, 我們可以用較短的有意義的識別符號來寫程式,這樣更方便一些。
(2) 巨集定義是在預編譯的時候就進行替換。程式中呼叫子函式執行完之後都必須飯後呼叫該子函式的現場繼續往下執行,這樣就會出現了函式轉換的消耗。但是使用帶引數的巨集定義就不會出現這個問題,因為它是在預處理階段即進行了巨集展開,在執行時不需要轉換,即在當地執行,但複雜的操作還是要由函式呼叫來完成,而且巨集定義所占用的目標**空間相對較大。所以在使用時要依據具體情況來決定是否使用巨集定義。
本文標題: linux c中define的用法小結
本文位址:
LINUX C中用define定義可變引數的巨集
一般在除錯列印debug資訊的時候,需要可變引數的巨集.從c99開始可以使編譯器標準支援可變引數巨集 variadic macros 另外gcc也支援可變引數巨集,但是兩種在細節上可能存在區別.1.va args va args 將 傳遞給巨集 如 define debug format,fprin...
define巨集定義中的 ,
1 stringizing 字串化操作符 其作用是 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input string is t s n inst...
define巨集定義中的 , , ,
巨集只能放在一行,分多行時應用在行尾用 需要是最後乙個字元,最後一行不寫 c c 巨集命令的神奇用法。先看下面三條語句 cpp view plain copy define conn x,y x y define tochar x x define tostring x x 1 連線操作符 x y表...