C中函数原型的作用是在调用函数之前通知编译器函数的类型(返回值的类型)、名称、参数的个数和分别使用什么数据类型。函数原型的生命有多重不同的形式,介绍如下:
【标准形式】:
#include<stdio.h>
int imin(int m, int n);//声明一个函数,返回两个int型数据中较小的一个
int main(void){ int m; int n; int min; m = 5; n = 6; min = imin(m, n); return 0; } int imin(int m, int n){//定义imin函数的具体实现
return (m < n) ? m : n; }
在main函数之前声明了imin函数,也可以这样声明:
int imin(int, int);//声明一个imin函数,返回两个int数据中较小的一个
以上两种都属于标准的形式。十分推荐使用上面两种中的任意一种。
除了标准形式之外,还有其他的声明形式,虽然可以编译运行,但不建议使用如下的几种形式:
1、在声明出直接定义:即在声明函数时直接给出函数的定义,一般用在函数很小、功能很简单的时候。上面的代码还可以这样写:
#include<stdio.h>
int imin(int m, int n){//声明一个imin函数,并直接给出函数实现
return (m < n) ? m : n; } int main(void){ int m; int n; int min; m = 5; n = 6; min = imin(m, n); return 0; }
2、在main函数中声明:即在main函数中声明,但一定要在函数调用前声明。示例如下:
#include<stdio.h>
int main(void){ int m; int n; int min; m = 5; n = 6; int imin(int m, int n);//声明一个函数,返回两个int型数据中较小的一个
min = imin(m, n);//声明必须在此行之前
return 0; } int imin(int m, int n){//定义imin函数的具体实现
return (m < n) ? m : n; }
3、声明中不给出参数:声明中只给出函数类型和名字,不给出参数列表。示例为:
#include<stdio.h>
int imin();//声明一个函数,返回两个int型数据中较小的一个,但不给出参数列表
int main(void){ int m; int n; int min; m = 5; n = 6; min = imin(m, n); return 0; } int imin(int m, int n){//定义imin函数的具体实现
return (m < n) ? m : n; }
这样在一些编译器中会报错无法编译,但在另外一些编译器中可以编译成功。
这样的例子还包括当函数没有返回值时不使用void。
这样做的坏处是,这种函数声明没有告诉编译器函数的参数列表,在进行函数调用时编译器就不能检查出由于参数类型或个数的错误而导致的执行失败。所以非常不建议使用这种方式声明函数,虽然有些编译器可以编译通过。
【总结】:C语言在对待函数声明中的原则是:必须在函数调用之前进行函数的声明。非常推荐使用标准的声明方式,这样可以使代码保持更好的结构,增强代码的可读性。对于其他的一些声明方式,虽然目前有些编译器中可以编译运行,但不推荐使用,随着版本的变化,一些现在可用的声明方式也许会在以后被禁止使用。