関数に関する制約
関数は、配列または関数を返すことができません。 ただし、配列または関数に参照またはポインターを返すことができます。 ただし、配列または関数への参照またはポインターを返すことができます。
struct Address
{ char szAddress[31]; };
Address GetAddress();
関数宣言の一方の return-type 部または関数のいずれかの引数の宣言で型を定義することは無効です。 次の有効な 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()
{
}