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則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何...