Поделиться через


Ограничения функций

Функции не могут возвращать массивы или функции. Однако они могут возвращать ссылки или указатели на массивы или функции. Другой способ возврата массива состоит в объявлении структуры с этим массивом в качестве единственного члена:

struct Address
{ char szAddress[31]; };

Address GetAddress();

Не допускается определять тип в части объявления функции, относящейся к возвращаемому типу, или в объявлении любого из аргументов функции. Следующий код, допустимый в языке C, недопустим в языке C++:

enum Weather { Cloudy, Rainy, Sunny } GetWeather( Date Today )

Предыдущий код недопустим, поскольку тип Weather имеет область видимости, локальную для функции GetWeather, и правильное использование возвращаемого значения невозможно. Поскольку аргументы функции имеют область видимости в функции, объявления, выполненные в списке аргументов, вызывали бы аналогичную проблему, если бы были разрешены.

Язык C++ не поддерживает массивы функций. Однако массивы указателей на функции могут быть полезными. При синтаксическом анализе Pascal-подобного языка код часто разделяется на лексический анализатор, который анализирует токены, и синтаксический анализатор, добавляющий семантику к токенам. Если анализатор возвращает некоторое порядковое значение для каждого токена, для выполнения соответствующей обработки можно создать код, показанный в следующем примере:

// restrictions_to_functions.cpp
// The following functions are user-defined
int Error( char *szText) {return 1;}
int ProcessFORToken( char *szText ) {return 1;}
int ProcessWHILEToken( char *szText ){return 1;}
int ProcessBEGINToken( char *szText ){return 1;}
int ProcessENDToken( char *szText ){return 1;}
int ProcessIFToken( char *szText ){return 1;}
int ProcessTHENToken( char *szText ){return 1;}
int ProcessELSEToken( char *szText ){return 1;}

int (*ProcessToken[])( char * ) = {
   ProcessFORToken, ProcessWHILEToken, ProcessBEGINToken,
   ProcessENDToken, ProcessIFToken, ProcessTHENToken,
   ProcessELSEToken 
};

const int MaxTokenID = sizeof ProcessToken / sizeof( int (*)(char*) );

int DoProcessToken( int TokenID, char *szText ) {
   if( TokenID < MaxTokenID )
      return (*ProcessToken[TokenID])( szText );
   else
      return Error( szText );
}

int main()
{
}

См. также

Ссылки

Объявления функций