define用法總結

2021-08-09 06:56:06 字數 3137 閱讀 4394

巨集定義是c語言提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯。巨集定義和操作符的區別是:巨集定義是替換,不做計算,也不做表示式求解。

格式:

#define 識別符號 字串

定義巨集:

#define pi 3.141592653 

//把圓周率定義為pi這個變數,而pi不能被修改,除非使用#define重新定義

使用巨集:

#include 

using

namespace

std;

int main()

{ cout

<< "半徑r=5的圓面積為:"

<< pi * 5 * 5

//result: 78.539816325

(1) 不對變數進行型別檢查

此缺點正是const的優點:

【define與const的區別】

define定義的變數是compile-time時期的變數,系統在編譯時將其全部替換,不會檢查變數的型別等屬性,不是很安全,可能存在問題沒有被發現。正因為其僅僅是編譯時期替換,所以其定義的變數,是不會在執行時候分配記憶體的,不占用記憶體空間。而const定義的變數是 run-time時期的變數,如果型別不匹配,系統在執行時就會發現並提示或報錯;const變數在執行時期,也是一種變數,系統會為其分配記憶體。

(2) 邊界效應

未加括號帶來的邊界效應

如:

#define mul(a,b) a*b

int x=1,y=2,z=3,w=0;

w = mul(x+y,z);

//我們希望得到(x+y)*z的結果:9

//但是得到結果是x+y*z=7

//正確的巨集定義: #define mul(a,b) (a)*(b)

再如:

#define intpt (int*)

intpt a,b;

//原意為a和b是int型指標,但是變成了int* a,b;a是int指標,b為int變數

//應該使用typedef (int

*) intpt; intpt a,b;

(3) 巨集定義展開後源**冗長

巨集定義是為了減少**的編寫和經常使用常量定義,對於程式設計師來說這個是沒有問題,得到的效果也很明顯,但是對於**解析後的檔案來說,如果非常極端地使用巨集,**中過多的使用巨集定義的函式,那麼在編譯檔案中就會在使用**出形成乙個**替代,而導致編譯後的檔案過大,不如使用函式效果好。

使用巨集可提高程式的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:陣列大小常用巨集定義。此外,巨集定義並不額外分配記憶體。

相比於函式的呼叫形式來說,使用巨集展開並不占用執行的時間,而是編譯的時間,所以相對函式呼叫(分配記憶體、儲存現場、值傳遞、返回值等)占用執行時間,巨集定義做到了犧牲極小的空間換取執行時間的縮短。

#define的變體,即#ifndef,可以防止頭頭檔案的重複引用或重複定義匯入。

(1). #ifndef和#define組合,一般用於標頭檔案中,用以實現防止同乙個標頭檔案重複匯入。實際使用中,即使你的標頭檔案暫時沒有被多個檔案所引用,為了增加程式可讀性、移植性、健壯性等,還是最好都加上。其用法一般為:

// "definehead.h"

#ifndef _definehead_h

#define _definehead_h

// include or define sth.

#endif

在理論上來說可以是自由命名的,但每個標頭檔案的這個「標識」都應該是唯一的;標識的命名規則一般是頭檔名全大寫,前後加下劃線,並把檔名中的「.」也變成下劃線。

這樣,以後某個檔案引用此標頭檔案,就包含了definehead.h檔案,而其他檔案如果再引用此標頭檔案的話,編譯器那麼就會判斷出來,已經define了definehead.h,已經有其他檔案引用了此檔案,so, the complier will not include this header file. 就可以發現解決重複引用標頭檔案的問題了。

#ifdef,可以實現加入自己需要的模組(原始檔)

在原始檔中加入:

// otheruse.cpp

#ifdef _definehead_h

#include "definehead.cpp"

#endif

可以實現在原始檔中加入definehead.cpp這個檔案中的**。注意不要再標頭檔案中使用這段匯入,可能會導致其他匯入otheruse.h的檔案匯入definehead.cpp,而在原始檔中不會存在這樣的問題。

#define pi 3.141592653
簡單的變數替換。

#define max(a,b) (a)>(b)?(a):(b)
求兩個數中較大的值,因為這個「函式」沒有型別檢查,就好像乙個函式模板似的,當然,它絕對沒有模板那麼安全就是了。可以作為乙個簡單的模板來使用而已。

define 中可以使用多行定義:

#define max3(a,b,c) \

printf("max value: ");\

printf("%d",a>b?(a>c?a:c):(b>c?b:c));

每一行都在最後加上乙個「\」,除了最後一行。

//定義巨集

#define [macroname] [macrovalue]

//取消巨集

#undef [macroname]

#ifndef _my_debug

#define all_mode 3

#else

#define one_mode 3

#endif

比較好的應用是大規模的開發過程中,特別是跨平台和系統的軟體裡,define最重要的功能是條件編譯。

#ifdef windows

......

......

#endif

#ifdef linux

......

......

#endif

define用法總結

1.define的簡單定義 例如 define 3.14 乙個簡單的 就定義好了,它代表3.14,如果在程式裡面寫 int r 2 int area r r 編譯器在處理這個 之前會對 進行處理替換為3.14。2.define的 函式定義 define可以像函式那樣接受一些引數,如下 define ...

C語言中 define用法總結

1.簡單的巨集定義 define 識別符號 替換列表 替換列表可以是數,字串字面量,標點符號,運算子,識別符號,關鍵字,字元常量。注意 替換列表是可以為空的 典型錯誤 define n 100 int a n 這樣會成為int a 100 這裡會處理成為一種標識記號一樣 define n 100 i...

c const與 define的用法總結

1 const a.可以用來定義常量 修飾函式引數 修飾函式返回值等三個作用。編譯階段 b.被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。2 define define是乙個巨集定義,可以定義乙個全域性變數,在整個檔案中都可以使用,它只是乙個字元替換操作,不做型別檢查...