C/C++ 误区三
—— 函数原型
作者:antigloss
http://cpp.ga-la.com
1. 预备知识 — int foo( ) 等于 int foo( void ) ?
许多 C 程序员认为如果函数定义为“int foo( ) { return 0; }”,则这个函数不接受任何参数。其实这是一个误解。事实上,这个函数可以接受任意数目的参数。如果你的函数不需要接受任何参数,请定义为 int foo( void ) { return 0; } 。下面请看一个例子:
/* 文件名: test.c */
int foo( )
{
return 0;
}
int main( void )
{
foo( 1, 2, 3 );
return 0;
}
以上的代码在 gcc3.2 和 vc6 都可以通过编译,并且没有任何警告信息。但是如果将 int foo( ) 改成 int foo( void ) ,gcc3.2 会警告说“传递给 foo 的参数太多”;而 vc6 则会警告说“foo 的参数列表为空”。这就证明了 int foo( ) 的确可以接受任意数目的参数,而 int foo( void ) 不接受任何参数。不过在 C++ 中,int foo( ) 和 int foo( void ) 等价。如果将上述代码保存为 test.cpp 进行编译,vc6 会告诉我们:error C2660: 'foo' : function does not take 3 parameters(错误 C2660: 'foo' : 函数不接受 3 个参数)。这就说明了 C++ 中,int foo( ) 的确和 int foo( void ) 等价。
2. C 和 C++ 中的函数原型
C++ 中函数原型和函数的定义必须匹配;而在 C 中,函数原型和函数定义可以不匹配。例如,下面一个程序在 C 中可以通过编译,但是在 C++ 中不能。
int foo( );
int main( void )
{
foo(20, 50);
return 0;
}
int foo(int a, int b)
{
return 0;
}
这是因为在 C 中,如果函数原型为“int foo( );”,则表示函数可以接受任意数目的参数(我们在 1 中做过这个实验),所以这个程序在 C 中通过编译,也就是说函数原型和函数定义可以不匹配。而在 C++ 中,int foo( ) 等价于 int foo( void ) ,说明函数不接受任何参数,而函数定义中却有参数列表,当然不能通过编译,也就是说函数原型和函数的定义必须匹配。