小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

[原]C/C++:如何理解復(fù)雜的聲明 - C/C++ - raof01-Haste mak...

 jijo 2009-06-19


這里說的聲明,不光適用于C/C++,其他的一些語言也能適用。

與java和C#等不同,聲明和定義在C/C++中有著比較明顯的區(qū)別:聲明僅僅是介紹名字(introduce names),而定義則會為該名字分配相應(yīng)的空間。打個通俗的比喻:聲明就是你在談話中提到某個人的名字,而定義就是把你提到的這個人帶到談話的人群中來,讓大家見識一下他/她是什么樣子。

這里主要介紹聲明。
在C中,聲明的形式為(dcl是declaration的簡寫):
dcl: optional *'s direct-dcl(含有可選"*"的direct-dcl)
direct-dcl name
                (dcl)
                direct-dcl()
                direct-dcl[optional size]
根據(jù)該規(guī)則進行逆向解析,就可以得到正確的聲明。簡化一下:“TypeName Declarator;”其中,Declarator就是聲明中的那個名字。當你遇到任何你不能理解的聲明時,這個法則就是救命稻草。最簡單的例子:
int aInt;
這里,int是TypeName,aInt是Declarator。
再說明一下結(jié)合緊密度。在聲明/定義變量時,可以使用一些修飾比如“*”,“[]”,“()”等。“()”(非函數(shù)聲明中的“()”)具有最高的緊密度,其次才是函數(shù)和數(shù)組的“()”和“[]”。
沒有“*”的聲明稱為直接聲明(direct-dcl),而有“*”稱為聲明(dcl)。直接聲明要比聲明結(jié)合的緊。分解聲明時,先讀出結(jié)合緊的。在這里,我把direct-dcl稱為更緊的結(jié)合,它比dcl結(jié)合得緊。
最后,需要你用英語來讀出這個聲明。對于“[]”,應(yīng)該讀成array of。
對于復(fù)雜的定義,可以將其分解。比如“T (*p)()”可以分解成“T D1()”,D1讀作:function returning T。其中D1是*p。那么該聲明應(yīng)該讀成:p is a poniter to。二者合在一起,就變成了p is a pointer to function returning T,即:p是指向返回T類對象的函數(shù)的指針。

再看一個稍微復(fù)雜的示例:
T (*pfa[])();
根據(jù)dcl和direct-dcl,可以分解成T1 D1(因為結(jié)合緊密度),T1, 也就是T (),那么應(yīng)該讀作:
D1 is function returning T。
D1又可以寫成T2 D2,其中T2是T1 [],可以分解成T1 D2[],讀作:
array of D2 function returning T。
D2是指針,讀作:pointers to。那么整個“T (*pfa[])();”應(yīng)該讀作:
pfa is an array of pointers to function returning T,即:pfa是個存放指向返回T類對象函數(shù)的指針的數(shù)組。

換種方式看,在這個例子中,pfa是名字,T(*[])()是類型。將(*pfa[])視為一體(direct-dcl),稱為D1,那么可以寫成T D1(),function returning object of T。在D1中,將*pfa視為一體(dcl),稱為D2,那么*pfa[]應(yīng)該是D2[](direct-dcl),array of D2。合起來就是array of D2 function returning object of T。D2是*pfa(dcl),替換到前面這句話,結(jié)果就是array of pointers to function returning object of T。

有了這些說明,可以試著做一下下面的題,看看自己是否真的理解了:
char **argv
argv: pointer to pointer to char
int (*daytab)[13]
daytab: pointer to array[13] of int
int *daytab[13]
daytab: array[13] of pointer to int
void *comp()
comp: function returning pointer to void
void (*comp)()
comp: pointer to function returning void
char (*(*x())[])()
x: function returning pointer to array[] of
pointer to function returning char
char (*(*x[3])())[5]
x: array[3] of pointer to function returning
pointer to array[5] of char
有了這個,就很容易理解下面這兩個typedef:
typedef void (*disp)(int);
typedef void (*signal(int, disp))(int);

在C++中,規(guī)則比C要復(fù)雜一些。不過,基本思想保持不變,按照C的原則來理解復(fù)雜的聲明,基本上就能滿足要求了。沒有在這里列出C++的規(guī)則一方面是因為太廣,不能覆蓋全;另一個原因就是,按照C的規(guī)則來就足夠了,畢竟C++要與C兼容。

這里討論的僅僅是聲明,不涉及到類型的signature,因此相對來說還是比較簡單的。

參考:
The C programming Language, by Brian W. Kernighan and Dennis M. Ritchie
The C++ programming Language, by Bjarne Stroustup
 
Copyleft (C) 2007-2009 raof01.
本文可以用于除商業(yè)外的所有用途。此處“用途”包括(但不限于)拷貝/翻譯(部分或全部),不包括根據(jù)本文描述來產(chǎn)生代碼及思想。若用于非商業(yè),請保留此權(quán)利聲明,并標明文章原始地址和作者信息;若要用于商業(yè),請與作者聯(lián)系(raof01@gmail.com),否則作者將使用法律來保證權(quán)利。

 




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多