多個宣告的概觀
多個宣告會指定名稱的物件或函式宣告的元件。 多個宣告也會指定已命名的物件為物件、 指標、 參照或陣列。 雖然多個宣告沒有指定基底型別,其嗎修改基本的型別,以指定衍生的型別,例如指標、 參考和陣列中的型別資訊。 套用至函式時,會使用完整指定的物件、 指標或參考的函式的傳回型別型別規範的宣告子。 (規範,討論宣告,以傳遞屬性,例如型別和存放裝置的類別。 修飾詞,將討論這一節,並在 Microsoft 專屬的修飾詞,修改多個宣告。) 下圖顯示的完整宣告MyFunction,並呼叫元件,宣告。
規範、 修飾詞和宣告子
Microsoft 專有的
大部分的 Microsoft 擴充的關鍵字可用來做為表單的修飾詞衍生的型別 ; 它們並非規範或多個宣告。 (請參閱 Microsoft 專屬的修飾詞。)
結束 Microsoft 特定
多個宣告會出現在宣告語法中之後規範的選擇性的清單。 這些規範會討論宣告。 宣告可包含多個宣告子,但每個宣告子宣告只能有一個名稱。
下列範例宣告顯示規範和宣告子組合的方式來形成完整的宣告:
const char *pch, ch;
在上述的宣告關鍵字 const 和char的規範清單所組成。 列出兩個宣告子: *pch和ch。 宣告多個實體的宣告,包括型別規範,後面跟著逗點分隔的多個宣告,以分號結束清單。
簡單物件的宣告子
一個簡單,例如 int 或雙引號的宣告是物件的只是物件的它的名稱,加上選用的括弧。
int i; // declarator is i
int (i); // declarator is (i)
多個宣告,如指標、 參考和陣列
名稱的前面的指標運算子會造成物件的指標或參考。 * 運算子宣告的名稱做為指標 ; 與運算子會將它宣告為參考。
int *i; // declarator is *i
int &i; // declarator is &i
int **i; // declarator is **i;
附加const或volatile提供指標,這些特殊的屬性。 這些規範宣告子中的使用 (如圖所而不是型別規範中) 會修改指標,而不是所指向的物件的屬性:
char *const cpc; // const pointer to char
const char *pcc; // pointer to const char
const char *const cpcc; // const pointer to const char
進一步的資訊可能會出現在 const 和動態指標。
變數的指標,類別或結構的成員會以適當的巢狀的名稱規範來宣告:
int X::* pIntMember;
int ::X::* pIntMember; // the initial :: specifies X is in global scope
char Outer::Inner::* pIntMember; // pointer to char in a nested class
括號將選擇性的常數運算式,在名稱後面的括號會讓物件可以是陣列。 連續的括號內宣告陣列的其他維度。
int i[5]; // array with five elements of type int numbered from 0 to 4
int i[]; // array of unknown size
char *s[4]; // array of pointers to char
int i[2][2]; // two dimensional array
多個宣告的函式
包含引數清單括號之後的名稱來宣告函式。 下列宣告函式的傳回型別int和三個引數型別的int。
int f(int a, int b, int c);
在 [引數清單的資訊,請參閱函式宣告。
藉由預先規劃的指標或參考運算子如下所示的函式名稱來宣告指標和函式的參考。 必須使用括號,通常是選擇性,區分函式指標和傳回指標的函式:
int (*pf)(int); // pointer to function returning int
int *f(int i); // function returning pointer to int
int (&pf)(int); // reference to function
巢狀的名稱規範來區別成員函式指標:
int (X::* pmf)(); // pointer to member function of X returning int
int* (X::* pmf)(); // pointer to member function returning pointer to int
請參閱指標成員。
函式和在相同的宣告中的物件
函式和物件宣告於相同的宣告,如下所示:
int i, *j, f(int k); // int, pointer to int, function returning int
語法可能會誤導之虞,在某些情況下。 下列宣告
int* i, f(int k); // pointer to int, function returning int (not int*)
看起來像是宣告int指標和傳回的函式int*,但不是。 這是因為 * 屬於宣告子, i不是為宣告的一部份、 f。
簡化 typedef 的宣告語法
更好的技術,不過,是使用typedef或兩者組合的括號和typedef關鍵字。 宣告陣列的函式的指標,請考慮:
// Function returning type int that takes one
// argument of type char *.
typedef int (*PIFN)( char * );
// Declare an array of 7 pointers to functions
// returning int and taking one argument of type
// char *.
PIFN pifnDispatchArray[7];
相等的宣告可以不加大typedef宣告,但它是複雜的錯誤可能會超過任何好處:
int ( *pifnDispatchArray[7] )( char * );
如需有關 typedef 的詳細資訊,請參閱 typedef 規範。
指標的參考,單一的基底型別的陣列可以結合在單一的宣告 (以逗號分隔),做為
int i, *i, &i, i[5];
更複雜的宣告語法
指標、 參考、 陣列和函式宣告子可組合來指定這類物件作為陣列的函式的指標、 陣列、 及其它的指標。
下列的遞迴文法完整描述指標宣告語法。
A declarator定義為其中一項:
1. identifier
2. qualified-name
3. declarator ( argument-list ) [cv-qualfiers] [exception-spec]
4. declarator [ [ constant-expression ] ]
5. pointer-operator declarator
6. ( declarator )
- 與指標運算子是一項:
* [cv-qualifiers]
& [cv-qualifiers]
:: nested-name-specifier * [cv-qualfiers]
因為宣告子可以包含多個宣告,很可能建構更複雜的衍生型別,例如指標陣列函數傳回陣列的函式指標,藉由使用上述的規則。 若要對如何建構每個步驟,開始與識別項,表示基底的資料類型,而且套用上述語法規則與前一個運算式為 「 declarator。 依照您套用的語法規則的順序必須是運算式英文中所述的方式相反。 如果套用指標運算子語法規則對應到一個陣列或函式的運算式,如果您想要的指標陣列或函式,如下列表格中的最後一列,請使用括號。
下列範例會顯示"以 10 為 int 的指標陣列的指標 」 的建築。
口語的運算式 |
宣告子 |
套用的語法規則 |
---|---|---|
|
1 |
|
若要 pointer(s) |
|
5 |
10 的陣列 |
|
4 |
指標 |
|
6,然後 5 |
多個指標,當參考、 陣列或函式修飾詞用、 多個宣告可能會變得非常複雜的作業。 主題解譯多個複雜多個宣告告訴您,如何讀取更複雜的宣告語法。 這個主題適用於 c 與 C++ 中,雖然在 C++,任何一處 * 用來指示變數的指標,例如 MyClass 的限定名稱:: * 萬用字元來指定變數的指標,類別的成員。