函数原型
函数声明前面函数定义并指定名称,返回类型、存储类和函数的其他属性。 若要为原型,函数声明还必须确定类型和标识符函数的参数的。
语法
declaration:
属性序列的声明opt说明符 init 公告列表opt**;**属性序列 的/*opt 是特定于 Microsoft 的 *
声明说明符:
存储类说明符声明说明符 opt类型说明符声明说明符 opt
类型限定符声明说明符 opt
init 公告列表:
init 声明init 公告列表 , init 声明
init 声明:
声明声明 = 初始值设定项
declarator:
指针opt直接 声明直接声明:/* 的函数声明 *
直接声明 ( 参数类型列表 ) /* 新的声明 *直接声明 ( 标识符的opt列表 )/* 过时样式声明 *
原型的窗体和函数定义相同,不同之处在于,它由个右括号后的分号停止并没有主体。 在任何情况下,返回类型必须与函数定义指定的返回类型一致。
函数原型具有以下重要使用:
它们建立除了 int外,返回类型的函数的返回类型。 虽然返回 int 值的函数不需要原型,建议使用原型。
没有完整原型,标准转换进行,但是,不会尝试检查参数的类型或数量与参数的数目。
,这些功能定义之前,原型用于初始化指针给函数。
参数列表检查参数的通信要使用在函数调用与函数定义的参数。
每个参数的转换的类型确定参数的解释函数调用堆栈的位置。 在形参和实参之间的类型不匹配可能导致堆栈上的参数被错误解释。 例如,在 16 位计算机,则为; 16 位指针将作为参数,然后声明为 long 参数,在堆栈的前 32 位被解释为 long 参数。 此错误会造成问题不仅在 long 参数,但是,在它后面的所有参数。 可以通过声明所有功能的完整函数原型检测此类型错误。
原型建立前面其定义函数的属性,以便调用函数 (或者出现在其他源文件) 可以检查参数类型和返回类型不匹配。 例如,因此,如果在原型中指定 静态 存储类说明符,则在函数定义还必须指定 静态 存储类。
完整参数声明 (int a) 可以使用抽象声明 (int) 组合在同一声明。 例如,下面的声明是合法的:
int add( int a, int );
原型可能包括两个将作为参数和标识符,每个表达式的类型。 但是,这标识符只有范围直至该声明的末尾。 原型也反射该条件参数的数目是易失的,或参数进行传递。 如果没有这样的列表,不能显示不匹配,因此,编译器无法生成有关它们的诊断消息。 请参见 参数 有关类型检查的更多信息。
编译,则使用 /Za 编译器选项时, Microsoft C 编译器的原型范围现在是 ANSI 兼容。 这意味着,如果声明在原型中的一 struct 或 联合 标记,标记中输入该范围而不是全局范围内。 例如,在中,当编译 ANSI 标准的 /Za,则不能调用该函数时未获得类型不匹配错误:
void func1( struct S * );
若要更正代码,请定义或声明 struct 或 联合 全局范围内在函数原型之前:
struct S;
void func1( struct S * );
在 /Ze 下,标记仍将输入全局范围内。