理解C C 語言的宣告語法 宣告

2022-08-24 16:06:14 字數 2587 閱讀 5420

c/c++

a.1宣告

一些宣告可能難以理解,特別是如果宣告幾個不同型別的名字或者那些指向函式指標的函式。例如在§10.1.1/171中,我們看到

int* p, q;

定義p為乙個「整型指標」型別的物件,q為乙個整型物件。在§10.1.2/173中,我們看到

double (*get_analysis_ptr())(const vector&);

宣告get_analysis_ptr為乙個函式,不帶任何引數,它返回乙個指標,它指向乙個函式,它帶有乙個const vector&引數,返回double。你可以通過重寫以清楚的表達這些宣告的含義,例如

int* p;

int q;

和// 定義analysis_fp為乙個函式,它帶乙個const vector&參// 數,返回乙個double型別。

typedef double (*analysis_fp)(const vector&);

analysis_fp get_analysis_ptr();

不幸的是,這種策略不會幫助你閱讀其它程式設計師**中令人迷惑的宣告。

一般,乙個宣告大致如下

宣告語句:宣告說明符[宣告子[初始化器]] [,宣告子[初始化器]]...;

它為每乙個宣告子宣告乙個名字。這些名字始於宣告開始的地方終於宣告作用域結束的地方。一些宣告同時也是定義。名字可以宣告多次,但是僅能定義一次。如果乙個宣告分配了儲存空間或者定義了類或函式體,那麼它也是乙個定義。

c++繼承了c的宣告語法。理解宣告的關鍵是認識到每個宣告包含兩個部分:一系列宣告說明符,它們一起說明乙個型別和其它正在宣告的特性,緊跟著是零個或多個宣告子(每個宣告子都可選的有乙個關聯的初始化器)。根據說明符和宣告子的形式,每個宣告子都為名字賦予乙個型別。

理解宣告的第一步是定位說明符和宣告子的邊界。這很容易:所有的說明符都是關鍵字或者型別名,因此說明符終止於第乙個不是以上型別之一的符號。例如,在

const char * const * const * cp;

很容易找到邊界:double是乙個型別,左括號後面既不是關鍵字也不是型別名。因此,宣告—說明符只是double,宣告子為宣告的其它部分,不包含分號。

double (*get_analysis_ptr())(const vector&);

另乙個例子,考慮§10.1.2/173中的宣告:

第乙個既不是關鍵字也不是型別名的符號是*,因此說明符是const char,唯一的宣告子* const * const * cp。

a.1.1說明符(specifiers)

我們可以將宣告—說明符分成三個部分:型別說明符,儲存類說明符,和其它說明符:

宣告說明符:

然而,這種劃分僅僅有助於理解,因為宣告本身不存在對應的劃分:宣告—說明符可以以任何次序出現。

型別說明符決定了宣告的型別。我們在§a.2/299中討論內建型別。

type-specifier: char | wchar_t | bool | short | int | long | signed

unsigned | float | double | void | type-name | const | volatile

type-name: class-name | enum-name | typedef-name

const說明符指出這種型別的物件不可以修改,volatile通知編譯器變數可能以非語言定義的形式改變,應該避免優化。

注意const既可以出現在說明符部分,這樣修改型別,也可以出現在宣告子部分,說明乙個const指標。這沒有任何歧義,因為宣告子部分的const總是跟著乙個*。

儲存類說明符決定變數的位置和生命週期:

storage-class-specifiers: register | static | extern | mutable

register說明符建議編譯器通過將此物件放到暫存器中以優化效能。

一般,區域性變數在退出宣告它們的塊(block)時即被銷毀;靜態變數的值在作用域的入口和出口間會被儲存起來。

extern說明符表明當前的宣告不是乙個定義,隱含著在其它地方存在相應的定義。

mutable儲存類僅用於類的資料成員,並且允許修改這些資料成員即使它們是常量物件的成員。

其它宣告說明符定義了與型別無關的屬性:

other-decl-specifier: friend | inline | virtual | typedef

friend說明符(§12.3.2/216 and §13.4.2/246)改寫保護。

內聯說明符用於函式定義,提示編譯器如果可能內聯下面的**。當展開呼叫時,函式定義必須出現在那個作用域,因此將內聯函式體放到宣告函式的標頭檔案中通常是乙個好主意。

virtual說明符(§13.2.1/234)僅用於成員函式,表示這個函式是動態繫結的。

typedef說明符(§3.2.2/43)定義型別的同義詞。

a.1.2宣告子(declarators)-未完待續

理解C C 語言的宣告語法 宣告子

理解c c 語言的宣告語法 宣告 乙個宣告為每個宣告子都宣告乙個實體 entity 同時為那個實體給出乙個名字,並且隱含的給出儲存類,型別,和由說明符給出的其它特性。說明符和宣告子一起決定了名字是否是乙個物件,陣列,指標,引用或函式。例如,宣告x為乙個整型指標,f為乙個函式返回乙個整型。正是宣告子 ...

C語言宣告語法

概述 在很多情況下,尤其是讀別人所寫 的時候,對c語言宣告的理解能力變得非常重要,而c語言本身的凝練簡約也使得c語言的宣告常常會令人感到非常困惑,因此,在這裡我用一篇的內容來集中闡述一下這個問題。問題 宣告與函式 有一段程式儲存在起始位址為0的一段記憶體上,如果我們想要呼叫這段程式,請問該如何去做?...

關於C C 函式指標宣告的理解

前言 由於最近對函式指標的理解比較模糊,所有又重新學習了一把關於函式指標的知識,參考了很多書籍和網上的文章。現在本人進行一下分享和總結。本文的其實只是整理和總結別人現有的文章,作為備用參考文件。正文 要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表...