在 C 的函数中必须使用 "return" 和 "void" 吗?
Is it mandatory to use "return" and "void" in the functions in C?
示例:
void Function(int Number)
{
process.....
**return;**
}
是否必须在每个函数的末尾使用 "return"?
示例 2:
void Function(**void**)
{
process...
}
如果我没有收到任何值,是否需要在参数列表中使用 "void"?
有人说不行,有人说行。
什么是对编译器的完美理解和 C 中的最佳实践?
当使用 void
作为 return 类型时,没有必要编写 return
语句,因为 void 本质上意味着不 returning 任何东西。但是,如果要显式退出函数,可以使用 return
。
void
作为参数并不是强制性的,它只表示没有传递任何参数。
对 void
函数使用 return
的唯一真正原因是提前退出该函数。根据 C99 §5.1.2.2.3 程序终止:main
假定 return 值为 0
而没有 return
reaching the } that terminates the main function returns a value of 0
但最好准确指定要 returned 的值。
为了回应帅哥们的评论,以下代码使用 gcc
和标志 -std=c89
、-std=c99
和 -std=c11
:
进行编译
#include <stdio.h>
int main(void) {
printf("Hello world\n");
}
至于void
作为一个参数,是告知C编译器你正在使用新的函数声明风格而不是旧的风格所必需的。它在技术上可以省略,但请谨慎使用,void
是首选方法。
根据 C 标准(6.7.6.3 函数声明符(包括原型)
- The special case of an unnamed parameter of type void as the only
item in the list specifies that the function has no parameters.
- An identifier list declares only the identifiers of the parameters
of the function. An empty list in a function declarator that is part
of a definition of that function specifies that the function has no
parameters. The empty list in a function declarator that is not part
of a definition of that function specifies that no information about
the number or types of the parameters is supplied.145)
脚注 145 指的是 "Future directions §6.11.6" 和“使用带空括号的函数声明符(不是原型格式参数
类型声明符)是一个过时的功能。"
因此声明
void f( void );
表示函数没有参数。
声明
void f();
表示参数个数和类型未知
声明同时是一个定义
void f()
{
}
表示函数没有参数。
至于 return 类型 return 类型 void
的函数中的 return 语句,那么如果它是函数的最后一条语句,那么通常它会被省略。使用最后的 return 语句只能混淆代码的 reader 因为他必须确定 return 语句中缺少表达式不是错字
省略参数中的void
意味着该函数接受任意数量的参数:
假设一个程序:
void func() {
}
void func2(void) {
}
int main(void) {
func(2);
func2(2);
}
现在用 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) {
也就是说,GCC带参数调用void func();
不是编译时错误,而带参数调用void func2(void)
是编译时错误。即使该函数没有任何参数,仍然可以使用任意数量的参数调用它。
然而,即使这确实编译,6.5.2.2 函数调用说 "If the number of arguments does not equal the number of parameters, the behavior is undefined."(并且 func
是用 1 个参数调用的,但没有参数)。
C11 标准 n1570 工作草案如下:
6.11.6 Function declarators
- The use of function declarators with empty parentheses (not prototype-format parameter
type declarators) is an obsolescent feature.
(有趣的事实:标准本身在其示例中使用 int main()
)。
至于 return
语句,如果它是最后一条语句,则可以从函数 returning void 中省略它。 Return 有 2 种用途 - 终止函数的执行并将值 returned 指定给调用者。
标准草案说:
- A
return
statement terminates execution of the current function and returns control to
its caller. A function may have any number of
return
statements.
Any 这里的意思是允许 returning 值的函数或不 return 值的函数 (returning void
)有没有 return
陈述。
函数声明草案中的 6.9.1 说:
- If the
}
that terminates a function is reached, and the value of the function call is used by
the caller, the behavior is undefined
因此,如果函数 return 是一个值(不是 void
),则省略 return 语句是未定义的行为,调用者使用 和 价值。 (作为例外,该标准还指出,在 main()
中省略 return
语句是 now 等同于 returning 0 的指定行为.
示例:
void Function(int Number)
{
process.....
**return;**
}
是否必须在每个函数的末尾使用 "return"?
示例 2:
void Function(**void**)
{
process...
}
如果我没有收到任何值,是否需要在参数列表中使用 "void"?
有人说不行,有人说行。 什么是对编译器的完美理解和 C 中的最佳实践?
当使用 void
作为 return 类型时,没有必要编写 return
语句,因为 void 本质上意味着不 returning 任何东西。但是,如果要显式退出函数,可以使用 return
。
void
作为参数并不是强制性的,它只表示没有传递任何参数。
对 void
函数使用 return
的唯一真正原因是提前退出该函数。根据 C99 §5.1.2.2.3 程序终止:main
假定 return 值为 0
而没有 return
reaching the } that terminates the main function returns a value of 0
但最好准确指定要 returned 的值。
为了回应帅哥们的评论,以下代码使用 gcc
和标志 -std=c89
、-std=c99
和 -std=c11
:
#include <stdio.h>
int main(void) {
printf("Hello world\n");
}
至于void
作为一个参数,是告知C编译器你正在使用新的函数声明风格而不是旧的风格所必需的。它在技术上可以省略,但请谨慎使用,void
是首选方法。
根据 C 标准(6.7.6.3 函数声明符(包括原型)
- The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.
- An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.145)
脚注 145 指的是 "Future directions §6.11.6" 和“使用带空括号的函数声明符(不是原型格式参数 类型声明符)是一个过时的功能。"
因此声明
void f( void );
表示函数没有参数。
声明
void f();
表示参数个数和类型未知
声明同时是一个定义
void f()
{
}
表示函数没有参数。
至于 return 类型 return 类型 void
的函数中的 return 语句,那么如果它是函数的最后一条语句,那么通常它会被省略。使用最后的 return 语句只能混淆代码的 reader 因为他必须确定 return 语句中缺少表达式不是错字
省略参数中的void
意味着该函数接受任意数量的参数:
假设一个程序:
void func() {
}
void func2(void) {
}
int main(void) {
func(2);
func2(2);
}
现在用 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) {
也就是说,GCC带参数调用void func();
不是编译时错误,而带参数调用void func2(void)
是编译时错误。即使该函数没有任何参数,仍然可以使用任意数量的参数调用它。
然而,即使这确实编译,6.5.2.2 函数调用说 "If the number of arguments does not equal the number of parameters, the behavior is undefined."(并且 func
是用 1 个参数调用的,但没有参数)。
C11 标准 n1570 工作草案如下:
6.11.6 Function declarators
- The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.
(有趣的事实:标准本身在其示例中使用 int main()
)。
至于 return
语句,如果它是最后一条语句,则可以从函数 returning void 中省略它。 Return 有 2 种用途 - 终止函数的执行并将值 returned 指定给调用者。
标准草案说:
- A return statement terminates execution of the current function and returns control to its caller. A function may have any number of return statements.
Any 这里的意思是允许 returning 值的函数或不 return 值的函数 (returning void
)有没有 return
陈述。
函数声明草案中的 6.9.1 说:
- If the
}
that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined
因此,如果函数 return 是一个值(不是 void
),则省略 return 语句是未定义的行为,调用者使用 和 价值。 (作为例外,该标准还指出,在 main()
中省略 return
语句是 now 等同于 returning 0 的指定行为.