例:
void Function(int Number)
{
process.....
**return;**
}
Run Code Online (Sandbox Code Playgroud)
是否必须在每个功能结束时使用"返回"?
例2:
void Function(**void**)
{
process...
}
Run Code Online (Sandbox Code Playgroud)
如果我没有收到任何值,是否需要在参数列表中使用"void"?
有人说不,有人说是.什么是完全理解C中的编译器和最佳实践的正确理由?
省略voidin参数意味着该函数接受任意数量的参数:
假设一个程序:
void func() {
}
void func2(void) {
}
int main(void) {
func(2);
func2(2);
}
Run Code Online (Sandbox Code Playgroud)
现在编译它gcc -std=c11 -Wall -pedantic test.c,你func2只会得到错误:
test.c: In function ‘main’:
test.c:9:5: error: too many arguments to function ‘func2’
func2(2);
^
test.c:4:6: note: declared here
void func2(void) {
Run Code Online (Sandbox Code Playgroud)
也就是说,void func();使用参数调用GCC不是编译时错误,而使用参数调用则是编译时错误void func2(void).即使该函数没有任何参数,仍然可以使用任意数量的参数调用它.
但是,即使这是编译,6.5.2.2函数调用也会说"如果参数的数量不等于参数的数量,则行为是未定义的".(并且func使用1个参数调用,但没有参数).
C11标准n1570工作草案说明如下:
6.11.6函数声明符
- 使用带有空括号的函数声明符(不是prototype-format参数类型声明符)是一个过时的功能.
(有趣的事实:标准本身int main()在其示例中使用).
至于return语句,如果它是最后一个语句,它可以从返回void的函数中省略.返回有2个用法 - 终止函数的执行并指定返回给调用者的值.
标准草案说:
- return语句终止当前函数的执行并将控制权返回给其调用者.函数可以包含任意数量的return语句.
任何在这里被认为是指两个函数返回值或函数不返回值(返回void)都不允许有任何 return声明.
功能声明草案中的6.9.1说:
- 如果
}终止了函数,并且调用者使用了函数调用的值,则行为是未定义的
因此,如果函数返回值(不是void),并且调用者使用该值,则省略return语句是未定义的行为.(作为例外的标准也说,这是规定的行为省略return的说法main()是,现在相当于返回0).
根据C标准(6.7.6.3函数声明符(包括原型))
- void类型的未命名参数作为列表中唯一项的特殊情况指定该函数没有参数.
- 标识符列表仅声明函数参数的标识符.函数声明符中的空列表是该函数定义的一部分,指定该函数没有参数.函数声明符中的空列表不是该函数定义的一部分,它指定不提供有关参数数量或类型的信息.145)
脚注145引用"未来方向§6.11.6"和"使用带空括号的函数声明符(不是原型格式参数类型声明符)是一个过时的功能."
这样宣言
void f( void );
Run Code Online (Sandbox Code Playgroud)
表示该函数没有参数.
宣言
void f();
Run Code Online (Sandbox Code Playgroud)
表示参数的数量和类型未知.
声明同时是一个定义
void f()
{
}
Run Code Online (Sandbox Code Playgroud)
表示该函数没有参数.
对于具有返回类型的函数中的return语句,void如果它是函数的最后一个语句,则通常省略它.使用最后一个return语句只会混淆代码的读者,因为他必须确保return语句中缺少表达式不是拼写错误.