C/C++ 误区—— 函数原型[转]

来源:互联网 发布:mac香港专柜价格多少 编辑:程序博客网 时间:2024/04/28 19:49

                  

1. 预备知识 int foo( ) 等于 int foo( void )

-----antigloss

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

 

 
原创粉丝点击