在 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 函数声明符(包括原型)

  1. The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.

  1. 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

  1. 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 指定给调用者。

标准草案说:

  1. 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 说:

  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 的指定行为.