是否必须使用" return"和"无效"在C的功能?

时间:2015-03-29 06:00:00

标签: c function return void

示例:

void Function(int Number)
{
   process.....

   **return;**
}

是否必须使用" return"在每个功能的最后还是没有?

示例2:

void Function(**void**)
{
   process...
}

使用" void"如果我没有收到任何值,那么在参数列表中是否必要?

有人说不,有人说是。 什么是完全理解编译器和C语言中的最佳实践的权利?

4 个答案:

答案 0 :(得分:6)

在参数中省略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函数调用也会说“如果参数的数量不等于参数的数量,则行为是未定义的”。 (并且使用1个参数调用func,但没有参数)。


C11标准n1570工作草案说明如下:

  

6.11.6函数声明符

     
      
  1. 使用带有空括号的函数声明符(不是prototype-format参数   类型声明者)是一个过时的功能。
  2.   

(有趣的事实:标准本身在其示例中使用int main()


对于return语句,如果它是最后一个语句,则可以从返回void的函数中省略它。返回有2个用法 - 终止函数的执行并指定返回给调用者的值。

标准草案说:

  
      
  1. 甲   返回   语句终止当前函数的执行并将控制权返回给   它的来电者。一个函数可以有任意数量的   返回   语句。
  2.   

这里的任何一个都意味着返回一个或多个不返回值的函数(返回void)的函数都允许 no return语句。

功能声明草案中的6.9.1说:

  
      
  1. 如果   }   到达函数终止,并使用函数调用的值   调用者,行为未定义
  2.   

因此,如果函数返回值(不是void),,则忽略return语句是未定义的行为,调用者使用该值。 (作为一个例外,该标准还表示,指定行为,省略return中的main()语句现在等同于返回0)。

答案 1 :(得分:5)

根据C标准(6.7.6.3函数声明符(包括原型)

  
      
  1. 类型为void的未命名参数的特殊情况   list中的item指定该函数没有参数。
  2.         

         
        
    1. 标识符列表仅声明参数的标识符   功能。函数声明符中的空列表   该函数的定义指定该函数没有   参数。函数声明符中的空列表不是其中的一部分   该函数的定义指定没有关于的信息   提供参数的数量或类型。 145)
    2.   

脚注145引用“未来方向§6.11.6”和“使用带空括号的函数声明符(不是prototype-format参数) 类型声明者)是一个过时的功能。“

因此声明

void f( void );

表示该函数没有参数。

声明

void f();

表示参数的数量和类型未知。

声明同时是一个定义

void f()
{
}

表示该函数没有参数。

对于返回类型为void的函数中的return语句,如果它是函数的最后一个语句,那么通常会省略它。使用最后一个return语句只会混淆代码的读者,因为他必须确保ret​​urn语句中缺少表达式不是拼写错误。

答案 2 :(得分:3)

当使用void作为返回类型时,没有必要编写return语句,因为本质上void意味着不返回任何内容。但是,如果要显式退出该函数,可以使用return

void作为参数并不是必需的,它只表示没有传递参数。

答案 3 :(得分:3)

return用于void函数的唯一真正原因是提前退出函数。根据C99§5.1.2.2.3程序终止,假设0的返回值为main而没有return

  

到达终止main函数的}返回值0

但最好准确指定要返回的值。

为回应酷男评论,以下代码使用gcc标记-std=c89-std=c99-std=c11进行编译:

#include <stdio.h>

int main(void) {
  printf("Hello world\n");
}

至于void作为通知C编译器您正在使用新函数声明样式而不是旧样式所必需的参数。从技术上讲,它可以省略,但要小心,void是首选方法。