Limitazioni sulle funzioni
Le funzioni non possono restituire matrici o funzioni. Possono, tuttavia, restituire riferimenti o puntatori a matrici o funzioni. Un altro metodo per restituire una matrice consiste nel dichiarare una struttura con solo quella matrice come membro:
struct Address
{ char szAddress[31]; };
Address GetAddress();
Non è consentito definire un tipo nella parte del tipo restituito di una dichiarazione della funzione o nella dichiarazione di qualsiasi argomento a una funzione. Il seguente codice di C valido non è valido in C++:
enum Weather { Cloudy, Rainy, Sunny } GetWeather( Date Today )
Il codice precedente non è consentito poiché il tipo Weather ha un ambito di funzione locale per GetWeather e il valore restituito non può essere utilizzato correttamente. Poiché gli argomenti alle funzioni hanno ambito di funzione, le dichiarazioni effettuate entro l'elenco di argomenti avrebbero lo stesso problema se non consentite.
C++ non supporta matrici di funzioni. Tuttavia, le matrici di puntatori a funzioni possono essere utili. Durante l'analisi di un linguaggio simile a Pascal, il codice viene spesso separato in un analizzatore lessicale che analizza i token e un parser che associa semantica ai token. Se l'analizzatore restituisce un valore ordinale particolare per ogni token, il codice può essere scritto per eseguire l'elaborazione corretta come illustrato in questo esempio:
// 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()
{
}