Einschränkungen bei Funktionen
Funktionen können Arrays oder Funktionen nicht zurückgeben. Sie können jedoch Verweise oder Zeiger auf Arrays oder Funktionen zurückgeben. Eine andere Möglichkeit, ein Array zurückzugeben, besteht darin, eine Struktur mit nur diesem Array als Member zu deklarieren:
struct Address
{ char szAddress[31]; };
Address GetAddress();
Es ist nicht zulässig, einen Typ entweder im Teil des Rückgabetyps einer Funktionsdeklaration oder in der Deklaration eines Arguments für eine Funktion zu definieren. Der folgende gültige C-Code ist in C++ ungültig:
enum Weather { Cloudy, Rainy, Sunny } GetWeather( Date Today )
Der vorhergehende Code ist nicht zulässig, da der Funktionsbereich des Typs Weather für GetWeather lokal ist und der Rückgabewert nicht ordnungsgemäß verwendet werden kann. Da sich Argumente für Funktionen im Funktionsgültigkeitsbereich befinden, würde bei Deklarationen innerhalb der Argumentliste dasselbe Problem auftreten, wenn sie nicht zulässig wären.
C++ unterstützt keine Arrays aus Funktionen. Arrays von Zeigern auf Funktionen können jedoch hilfreich sein. Beim Analysieren einer Pascal-ähnlichen Sprache wird der Code oft aufgeteilt in eine lexikalische Analyse, die Token analysiert, und einen Parser, der Semantik an Token anfügt. Wenn die Analyse einen bestimmten Ordinalwert für jeden Token zurückgibt, kann Code geschrieben werden, um die entsprechende Verarbeitung auszuführen, wie in diesem Beispiel dargestellt:
// 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()
{
}