define 和 typedef 的比較

最近工作中遇到一個問題,加深了我對define和typedef之前區別的認識,特此記錄。
問題:pclint檢查到一個指針變量,沒有使用該指針去直接改寫其指向的內存的情況,因此建議使用const修飾。

特別地,該指針類型是用typedef定義的。
typedef void * HANDLE
HANDLE var;

按照pclint給的建議,本能的改成了 const HANDLE var; 此時編譯報錯爲var是一個只讀變量。但是如果直接寫成const void * var,則不會報這個問題。

也就是以下兩個寫法並不等價。
const HANDLE var;
const void * var;

但是如果換作define,也毫無問題。
#define MACRO_HANDLE (void *)
const MACRO_HANDLE var;

通過上述的問題,進而引出define和typedef真正的區別。
typedef:
1.tyedef是C語言中預留的關鍵字,和 int/struct/const等關鍵字是一類。
2.顧名思義,typedef = type define, 它是定義一種新類型的方法,也就是說經過typedef void * HANDLE;之後,HANDLE是一個新的類型,作爲指針標識的*在其定義內部,對外是不再體現的。此時的const HANDLE var;和const int var;效果相同,直接把var定義成常量了。

define:
1.define是編譯器的預處理指令,和#ifndef/#endif這類指令是一類。
2.define的作用只是純粹的字符串替換,它的作用只是做給編譯器看的,在預編譯結束時,宏替換完成。此時代碼中的const MACRO_HANDLE var;已經被編譯器改成了const void * var;所以之後編譯時,自然沒有問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章