对函数的限制

函数无法返回数组或函数。 但它们可以返回对数组或函数的引用或指向它们的指针。 返回数组的另一个方法是仅使用该数组将结构声明为成员:

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()
{
}

请参见

参考

函数声明