函式限制
函式不能傳回陣列或函式。 但可以將參考或指標傳回至陣列或函式。 另一個傳回陣列的方式是宣告只以該陣列為成員的結構:
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()
{
}