当我们用c语言定义函数时,通常会以foo ()的形式声明没有参数的函数。 这种方法是直观的,与用其他c类语言声明的方法相同,但在c语言中它不是一种没有参数的函数形式。 举个简单的例子吧。
//声明不带参数的函数Hello
静态语音助手()
{
}
静态语音测试(
{
//在这里,我们在调用Hello时使用了两种int类型的实参。
//这里只报告了“呼叫等待”的警告
hello (1,2 );
}
//在此重新声明Hello,添加两种int类型的参数,然后单击,
warning什么都没有!
staticvoidHello(int,int );
(intmain(intargc,const char * argv[] ) ) ) ) ) ) ) ) ) )。
{
//使用两个int类型的整数作为实例调用Hello,
没有什么warning
hello (1,2 );
}
可以看到,尽管存在几个warning,但上面的代码仍然会在Clang编译器下成功编译和执行。
如果我们把上述代码中的Hello声明为staticvoidhello(void )会怎么样呢? 看看下面的代码示例。
//声明没有参数的函数Hello
静态语音(语音) ) ) ) )。
{
}
静态语音测试(
{
//在这里,我们在调用Hello时使用了两种int类型的实参。
//报告“toomanyargumentstofunctioncall,expected 0,have 2”的错误!
hello (1,2 );
}
//在此重新声明Hello,添加两种int类型的参数,然后单击,
//报告了“conflictingtypesfor ' hello '”的错误!
staticvoidHello(int,int );
(intmain(intargc,const char * argv[] ) ) ) ) ) ) ) ) ) )。
{
//使用两个int类型的整数作为实例调用Hello,
//报告“toomanyargumentstofunctioncall,expected 0,have 2”的错误!
hello (1,2 );
}
这样,foo ) )的形式并不是说foo这个函数不能有参数,而是说它有什么类型的参数、有多少个参数,是不确定的,并且可以进行完整的参数类型和个数的重新声明。 另一方面,如果使用foo(void )格式,则即使完全限定foo的参数,也不允许具有参数。 如果重新声明它,则不能使用其他参数类型或任意添加其他参数。
在c语言中,void在函数类型参数以外的地方使用时可以作为一个类型(不完整类型)使用,但在函数类型参数类型中实际上表示“无”,甚至不允许有表达式。 举个例子:
//声明没有参数的函数Hello
静态语音(语音) ) ) ) )。
{
puts('Hello,world!' );
}
//声明了没有参数的函数Test
静态语音(语音)。
{
//在这里,可以用return语句返回相同void返回类型的Hello函数调用
返回hello (;
}
(intmain(intargc,const char * argv[] ) ) ) ) ) ) ) ) ) )。
{
//这个调用方法是错误的! 调用Test函数时不能传递参数。
//在此报告为“Too many arguments to function call,expected 0,have 1”
测试(hello ) );
}
因此,考虑到代码的安全性,如果今后编写c语言代码时定义不带任何函数参数,请使用void显式指定参数类型,而不是foo ()的形式。 另一方面,在c的情况下,foo (和foo ) void完全等同。 由于c具有函数重载功能,因此在语言语法机制上不允许具有不同函数参数类型的两个同名函数作为一个函数实体存在。