Общие сведения о деклараторов

Деклараторы компоненты объявления, указывающих имена объектов или функций.Деклараторы также определяют ли именованный объект объект, ссылка указателя или массива.Деклараторы еще не определяют базовый тип, они изменяют данные о типе в базовом типе, чтобы определить производные типы, такие как указатели, ссылки и массивы.При применении к функциям, декларатор работает с описателем типа полностью, чтобы определить возвращаемый тип функции, чтобы быть объектом, указателем или по ссылке.(Описатели, обсуждаемые в пределах Объявлениятип транспорта свойства, как и класс хранения.Модификаторы, описываемые в этом разделе, а также в пределах модификаторы Майкрософт-Специфическогоизмените деклараторы.) На следующем рисунке показано полное объявление MyFunctionи вызовы компонентов вне объявления.

Описатели модификаторы деклараторы, и

Определяет деклараторы модификаторов

Только для систем Microsoft

Большинство ключевые слова расширенные Майкрософт можно использовать в качестве модификаторов для формирования производные типы. они не описателей или деклараторов.(См. модификаторы Майкрософт-Специфического.)

ЭЛЕМЕНТ, относящийся Майкрософт

Деклараторы отображаются в синтаксис объявления после того как необязательный список описателей.Эти описатели обсуждаются in объявления. Объявление может содержать несколько декларатор, но каждый декларатор объявляется только одно имя.

Следующее объявление образца показано, как описатели и деклараторы объединяются для формирования полное объявление:

const char *pch, ch;

В предыдущем объявлении ключевые слова Const и char создание списка описателей.В списке декларатора: 2 *pch и ch.Объявление, которое объявляет несколько сущностей состоит из описателя типа, за которым следует список с разделителями-запятыми деклараторов завершенным, точкой с запятой.

деклараторы для простых объектов

Декларатор простого объекта как int или double просто имя его с дополнительными скобки.

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 OR 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 и volatile.

Указатель на член класса или структуры объявлен с соответствующим вложенных описателем имени:

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 до 3 аргументов типа int.

int f(int a, int b, int c);

Дополнительные сведения о списках см. arguments. объявления функции.

Указатели и ссылки на функции указываются путем добавления указатель или ссылаются на оператор к имени функции, как показано ниже.Требуются круглые скобки, отличающие обычно являются необязательными, указатель на функцию из функции, которая получает указатель.

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

Лучший метод, однако использовать a 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».

учтное выражение

Декларатор

Синтаксическое правило применяется

i

1

указатели

*i

5

массив 10

(*i)[10]

4

указатель на

*((*i)[10])

6 и 5

При использовании нескольких модификаторов указателя, массивы или ссылки, функции, деклараторы могут стать довольно осложненными.Раздел Интерпретация более сложные деклараторы описывает, как выполнить чтение более сложный синтаксис декларатора.Раздел применимо как к c# и C++, хотя в C++ в любом месте * используется для указания указатель, полное имя, что и MyClass:: * может использоваться для определения указателя на член класса.

См. также

Ссылки

Деклараторы