部落格好久沒有更新了,主要是因為工作忙,即便不忙也要看看書,工作了才發現好多東西根本就會直接忘記,因為我們工作用不到!比如c++的東西,現在連虛函式表都不快不記得了,慚愧咯!而且我還發現工作了,看書反倒成了一種非常好的休閒了,不過希望我的朋友,同學們都好.
現在就說說typedef和const之間的那麼一道陷阱,而且還很深!
現在也是找工作的時間了,弄清楚這個還是很有好處的,或許很多公司就會用這個來欺負"弱小".
記得好像是現在我就來說說我的理解,之間的**就不注意命名規範了,還有一些工作的**肯定也是不能貼了.
先給乙個引子,如果我有乙個全域性變數,是乙個二維陣列,現在的問題就是,老闆不喜歡全域性變數,他要弄成乙個static變數,需要封裝一下,怎麼弄,比如這個二維的變數是:
那麼我現在就要讓這個靜態函式能穿越檔案,就用乙個函式封裝起來,然後,返回這個變數的位址,要麼就用直接值拷貝的方法,把值按位複製除去都行,如下操作?
那麼現在的問題就很簡單了,只要給乙個適當的返回型別就ok了.這樣?
有點簡單,有點粗暴,卻不那麼有效!
引入typedef,我們可以把乙個很複雜的型別用typedef來實現型別的替代,記住是typedef不是define.先定義型別,然後就是作為函式的返回值就ok咯.
typedef const int (*type)[8];
那麼就肯簡單了,如下給出我們乙個正確實現:
如此便ok了.
故事到這裡就結束了?還沒有!
繼續看,我上面的type的定義裡面加了乙個const,下面我定義乙個不加const的型別:
typedef char *xp; int main(int argc, _tchar* argv)
xp可以說是乙個自定義型別,我在定義xp1的時候加上了const修飾,那麼從上面的程式來看,1處是沒有問題的,在typedef之後,再在變數定義時候加的const實際上是被編譯器放在了星號自後了,那麼這個const就表示他修飾的是這個指標而不是變數本身,結果2處就錯了,因為我檢視修改指標xp1.
那我要把const應用與變數而不是指標,就要把const在typedef的時候帶上,放星號前面,那麼const就修飾的是變數了,如下:
typedef const char *xp; int _tmain(int argc, _tchar* argv)
這樣的話,2處就會報錯,原因上面已經說過了.
回到二維的,也就比較好理解了
const修飾的是後面陣列的位址了.自然也就相當於:
int (*const type_2)[8];
如下,同樣也可以給出乙個例子:
typedef int (*type_2)[8]; int _tmain(int argc, _tchar* argv) ; const type_2 ty1 = a; return 0; }
同樣:typedef const int (*type)[8]; int _tmain(int argc, _tchar* argv) ; const int xx[2][8]= ; type ty1 = xx; ty1[1][1] = 10; //1 return 0; }
這個const就是修飾的變數的值了,1處自然也不對了.
typedef char *xp; int _tmain(int argc, _tchar* argv)
上面的程式裡面,只要是能表示一維的都可以給myxp賦值,但是型別一定要完全一致.這裡容易出兩個問題:
1.一維指標但是型別不一致,當然了,c語言給我們提供了強制型別轉換;
2.取陣列名的位址,再給myxp賦值,這樣也是不對的,因為維度不匹配:
typedef char *xp; int _tmain(int argc, _tchar* argv)
1處就明顯不對了,但是有人說,陣列名和陣列名取引用是乙個值啊!卻是,但是,對於編譯器而言,兩者是不一樣的,a是char*,而&a是char (*)[100]的型別,a+1得到的是a[1]的位址,而&a+1得到的是什麼?我想稍微注意點的同志們都知道是下乙個100大小的陣列的首位址了,也就是a[100]這個本不應該存在的位址了,而且僅僅是值一樣,還是乙個char (*)[100]的型別.這個就不說遠了.有需要的可以再寫一篇文章了.
對於typedef乙個二維的指標也可以用型別的方法初始化:
typedef char (*type)[8]; int _tmain(int argc, _tchar* argv) ; type myxp = &a; myxp = b; myxp = &b; //1 myxp = b[1]; //2 return 0; }
這裡1和2自然也是不對的,因為他們的維度也不匹配!
就說這麼多吧,好累,下班手工回家咯!
希望大家有什麼意見,可以提出來,一起學習.
typedef和const之間的trap
部落格好久沒有更新了,主要是因為工作忙,即便不忙也要看看書,工作了才發現好多東西根本就會直接忘記,因為我們工作用不到 比如c 的東西,現在連虛函式表都不快不記得了,慚愧咯 而且我還發現工作了,看書反倒成了一種非常好的休閒了,不過希望我的朋友,同學們都好.現在就說說typedef和const之間的那麼...
const和typedef的用法
無意間看待同學的一篇關於const究竟修飾了誰的文章,裡面有一些關於typedef的用法,現在貼出源 include typedef int intpointer int main pa 11編譯錯誤很容易理解,因為const修飾使得記憶體值為唯讀,就是指向乙個常量。pb 編譯錯誤,卻很難理解,因為...
const限定符和引用和typedef
1.定義const物件 const int i 10 變數i仍然是乙個左值,但是現在這個左值是不可修改的,任何修改i的嘗試都會導致編譯出錯。2.const物件預設為檔案的區域性變數 非const變數預設為extern。要使const變數能夠在其他的檔案中訪問,必須顯示的指定它為extern。3.引用...