理解c/c++語言的宣告語法-宣告
。 乙個宣告為每個宣告子都宣告乙個實體(entity),同時為那個實體給出乙個名字,並且隱含的給出儲存類,型別,和由說明符給出的其它特性。說明符和宣告子一起決定了名字是否是乙個物件,陣列,指標,引用或函式。例如,
宣告x為乙個整型指標,f為乙個函式返回乙個整型。正是宣告子*x和f()使型別x和f產生區別。
int *x, f();
declarator: [ * [ const] | & ]... direct-declarator
direct-declarator: declarator-id | ( declarator ) |
direct-declarator ( parameter-declaration-list ) |
direct-declarator [ constant-expression ]
a declarator-id is an identifier, possibly qualified:
declarator-id: [ nested-name-specifier ] identifier
nested-name-specifier: ...
如果宣告子是乙個僅包含乙個declarator-id的直接-宣告子,那麼這說明這個識別符號具有decl-specifiers隱含的屬性,而沒有進一步的修飾。例如,在下面的宣告中
int n;
宣告子是n,這是乙個只包含direct-declarator的declarator-id,因此根據含義,n的型別為整型。
如果宣告子為其它形式,那麼你可以按照下面的方法確定識別符號的型別:首先,假設t為decl-specifiers隱含的型別,忽略friend或static等非型別屬性,同時假設d為宣告子。然後重複下面的步驟直到推導出d為乙個declarator-id,此時t正是你所尋找的型別:
1. 如果d形如(d1),那麼用d1替換d。
2. 如果d形如* d1 或 * const d1,那麼根據是否有const,用「指標,它指向t」或者「常量指標,它指向t」替換t,然後用d1替換d。
3. 如果d形如d1(引數-宣告-列表),那麼用引數由引數-宣告-列表定義的、「返回t的函式」替換t,然後用d1替換d。
4. 如果d形如d1[常量-表示式],那麼用元素個數由常量-表示式給出的「t陣列」替換t,然後然後用d1替換d。
5. 最後,如果宣告子形如&d,那麼用「t引用」替換t,然後用d1替換d。
作為乙個示例,考慮下面的宣告
int *f();
首先,t和d分別為int和*f(),因此d形如*d1,其中d1為f()。
你可能認為d可以形如d1() 或者 *d1。然而,如果d形如d1(),那麼d1將不得不為*f,d1將是乙個direct-declarator(因為本節開始處的語法注1規定只有direct-declarator前面是())。但是如果我們看看direct-declarator的定義注2,很明顯它不能包含*。因此,d只能是*f(),它形如*d1,其中d為f()。
既然我們已經確定d1為f(),那麼我們知道必須用「指標,它指向t」替換t,即「指標,指向整型」,同時用f()替換d。
至此我們還沒有解析d為declarator-id,因此我們必須重複該過程。此時,d1只能是f,因此我們用「返回t的函式」替換t,它是乙個「返回整型指標不帶引數的函式」,然後用f替換d。
此時,d為declarator-id,因此推導結束。我們已經確定宣告
int *f();
宣告f的型別為「不帶引數返回整型指標的函式」。另乙個例子,宣告
int* p, q;
具有兩個宣告子,*p和q。對於每個宣告子,t都是int。對於第乙個宣告子,d是*p,因此t變成「指標,它指向整型,」而d為p。宣告p型別為「指標,它指向整型」。
我們單獨分析第二個宣告子,t還是int,d是q。很明顯宣告q為整型。
最後,讓我們分析§10.1.2/173中那個奇怪的例子:
double (*get_analysis_ptr())(const vector&);
分析過程可以分為下面五個步驟
1. t: double d: (*get_analysis_ptr())(const vector&)
2. t: 返回double帶有 const vector& 引數的函式 d: (*get_analysis_ptr())
3. t: function returning double... (如前所示) d: *get_analysis_ptr()
4. t: 指標,它指向乙個返回double...的函式 d: get_analysis_ptr()
5. t: 乙個函式,返回乙個函式指標,它指向乙個返回double...的函式 d: get_analysis_ptr
get_analysis_ptr是乙個函式,它返回乙個函式指標,它指向乙個返回double,帶有const vector&引數的函式。我們將如何展開const vector&作為乙個練習。幸運的是,很少有函式宣告如此令人迷惑;它們中的大多數看起來
declarator: declarator-id ( parameter-declaration-list )
到目前為止,常見情況中最難的是返回函式指標的函式。
注1:這裡將allows翻譯為規定而不是允許。因為如果翻譯為允許,言外之意是()後面還可以是其它東西,但是在五條語法中找不到這種東西。語法指的是direct-declarator ( parameter-declaration-list )
注2:「declarator: [ * [ const] | & ]... direct-declarator」
理解C C 語言的宣告語法 宣告
c c a.1宣告 一些宣告可能難以理解,特別是如果宣告幾個不同型別的名字或者那些指向函式指標的函式。例如在 10.1.1 171中,我們看到 int p,q 定義p為乙個 整型指標 型別的物件,q為乙個整型物件。在 10.1.2 173中,我們看到 double get analysis ptr ...
C語言宣告語法
概述 在很多情況下,尤其是讀別人所寫 的時候,對c語言宣告的理解能力變得非常重要,而c語言本身的凝練簡約也使得c語言的宣告常常會令人感到非常困惑,因此,在這裡我用一篇的內容來集中闡述一下這個問題。問題 宣告與函式 有一段程式儲存在起始位址為0的一段記憶體上,如果我們想要呼叫這段程式,請問該如何去做?...
關於C C 函式指標宣告的理解
前言 由於最近對函式指標的理解比較模糊,所有又重新學習了一把關於函式指標的知識,參考了很多書籍和網上的文章。現在本人進行一下分享和總結。本文的其實只是整理和總結別人現有的文章,作為備用參考文件。正文 要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表...