関数の制限
関数は配列または関数を返すことができません。これらは配列または関数へのポインターまたは参照できます。配列を返す別の方法としてその配列はメンバーだけを含む構造体を宣言することです :
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()
{
}