Restrictions sur les fonctions
Les fonctions ne peut pas retourner les tableaux ou les fonctions.Ils peuvent, toutefois, retourner des références ou des pointeurs vers les tableaux ou des fonctions.Une autre manière de retourner un tableau est de déclarer une structure avec uniquement ce tableau comme membre :
struct Address
{ char szAddress[31]; };
Address GetAddress();
Il n'est pas conforme de définir un type dans la partie de type d'une déclaration de fonction ou dans la déclaration de n'importe quel argument à une fonction.Le code autorisé suivant C est non conforme dans C++ :
enum Weather { Cloudy, Rainy, Sunny } GetWeather( Date Today )
Le code précédent est possible car le type Weather a des variables locales de la portée de la fonction à GetWeather et la valeur de retour ne peut pas être correctement utilisée.Étant donné que les arguments aux fonctions ont une portée de la fonction, les déclarations faites dans la liste d'arguments auraient le même problème si elle n'est pas autorisé.
C++ ne prend pas en charge les tableaux de fonctions.Toutefois, les tableaux de pointeurs vers des fonctions peuvent être utiles.En analysant un langage similaire à Pascal, le code est souvent compose d'un analyseur lexical qui analyse des jetons et un analyseur qui englobe la sémantique des jetons.Si l'analyseur retourne une valeur ordinale particulière pour chaque jeton, le code peut être écrit pour exécuter le traitement approprié comme illustré dans cet exemple :
// 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()
{
}