令人迷糊的define和typedef

2021-06-02 00:38:36 字數 2789 閱讀 9026

1.剛接觸mfc時會看到很多陌生的資料型別,關鍵字.一開始會特別反感,不適應.比如uint,dword.不過你右擊一點它們選擇跳轉到定義.就會發現有這樣的定義:

typedef unsigned int        uint;                   typedef unsigned long       dword;         

另外還有一些巨集比如on_command,跳轉到定義是這樣的:

#define on_command(id, memberfxn) \

,2.另外有時在乙個類的定義之前會發現這樣的語句:

#ifndef  _mainfrm_h

#define  _mainfrm_h

typedef應該是typedefine的縮寫.顧名思義就是型別定義.於是我們可以把它理解為重新定義乙個新型別.只不過是基於原有的型別.另外也可以理解為某個型別的別名.這有點像oracle中的同義詞.比如上面提到的uint,我們可以認為它是乙個新的型別,和型別unsigned int一樣.這樣我們定義乙個非負整數時有兩種等價的方式了:

unsigned int num;或uint num;它們可以互相替換.uint用起來自然方便一點,簡潔一點.但凡事有利有弊.新新增個uint我們又得花時間去熟悉它記住它.

define就僅涉及到替換某一段字元,不涉及到型別.

舉個例子:

#include

typedef  int  int;        //注意typedef不能用來替換一般的字元.比如typedef 123 n;是錯誤的

#define n 123

#define out(x)  std::coutint num = n;     //等同於int num = n;

char* str = "hello world";

out(str);      //輸出hello world

out(num);   //輸出123

但是雖然define是僅替換,但如果替換的字元恰巧是型別定義的關鍵字,那就跟typedef差不多了.比如#define uint int 和typedef int uint;達到的效果一樣.但是只是效果一樣,但意義不一樣的.比如這種情況

typedef  int* int_ptr1;

#define  int_ptr2 int*

int_ptr1 a,b;      //a和b都是int*型別的指標

int_ptr2 c,d;     //c是int*型別的指標.而d就是int了

這看起來有點暈乎的啊.不過不用去管它們的區別.只要你在涉及到型別的地方用typedef,只涉及到替換的情況用#define好了.這樣就不用管這樣的煩心事了啊

補充:明白了typedef 和#define的區別後但用有時可能會把他們混淆,分不清誰是誰了.我們可以這樣來記憶.

1.typedef裡面有個type那肯定是和型別有關的.另外我們平時定義乙個型別時會在後面加個分號;所以用typedef時也記得在後面加個分號

2.#define裡面有個fine,那就是好.好在**呢.符合思維習慣.我們平時定義某個東東時習慣這樣的順序,比如你是個王八蛋.你在前面,定義你的詞在後面.#define也是這樣.

比如#define 你  "是個王八蛋"    那麼你就代表著王八蛋.另外#define定義後面不用分號(你執行它會成功的,

平時我們都習慣用英語字母做識別符號,其實用漢字也一樣可以用來

做變數名函式名的,只不過會有些警告)

而typedef不好,它倒過來了.比如typedef  int  int;  //int代表int但它跑後面去了,而不是typedef int int;

假如有三個標頭檔案one.h ,two.h, three.h

在two.h中有include "one.h"

在three.h中有include "one.h"      include "two.h"

編譯three.h的時候先編譯one.h,然後編譯two.h,由於two.h裡面引用了one.h這裡one.h又會被重複編譯一次.這樣就會出錯,說類型別重複定義

我們在one.h中這樣寫就可以防止這種錯誤

#ifndef    _one_h        //_one_h這名字是隨便取的,只要別重複,並且跟#define中的一樣就行了.

#define  _one_h

//#pragma once           //這是我注釋掉的.在vs中你建立乙個類時它自動給你新增它.實現的功能和#define一樣.防止重複編譯

//不過#pragma是編譯器相關的.如果你不用vs用其他的有可能會出錯.所以最好還是用#define.它是通用的.

class one

one(void);

~one(void);

#endif

我們在程式執行時去動態的做一些判斷,符合某些條件哪些**執行,不符合就不執行.例如是debug還是release,是32位的平台還是64位的平台.我們可以用#define來做判斷

舉例:#include "stdafx.h"

#include

using namespace std;

void main()

其中的_win32是編譯器裡早定義好的.比如你在vs裡工具欄裡選了win32那麼預設就#define  _win32了.如果選x64就對應_win64,選debug對應_debug

當然你也可以自己定義.

#include "stdafx.h"

#include

using namespace std;

#define  select

void main()

C語言中巨集定義 define和關鍵字typedef

define巨集定義是字元替換,typedef是定義型別。define int int是將程式中字元為int的字元全部替換為int,在編譯預處理是進行簡單的字元替換,不做正確性檢查,不管含義是否正確,都進行替換。typedef int int是將int定義為int型的字元型別,是採取像定義變數的方法...

Typedef和define的區別

typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。1 首先,二者執行時間不同 關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何...

C C Typedef和define的區別

typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。1 首先,二者執行時間不同 關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何...