当前位置: 代码迷 >> C语言 >> [原创]C/C++ 误区三 ―― 函数原型
  详细解决方案

[原创]C/C++ 误区三 ―― 函数原型

热度:359   发布时间:2005-08-06 00:16:00.0
[原创]C/C++ 误区三 ―― 函数原型

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 ) ,说明函数不接受任何参数,而函数定义中却有参数列表,当然不能通过编译,也就是说函数原型和函数的定义必须匹配。

搜索更多相关的解决方案: 误区  函数  原型  

----------------解决方案--------------------------------------------------------
  相关解决方案