是否必须使用;return";及;“无效”;在C中的函数中?

是否必须使用;return";及;“无效”;在C中的函数中?,c,function,return,void,C,Function,Return,Void,示例: void Function(int Number) { process..... **return;** } void Function(**void**) { process... } 是否必须在每个函数末尾使用“return” 示例2: void Function(int Number) { process..... **return;** } void Function(**void**) { process... } 如果我没有收到

示例:

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

   **return;**
}
void Function(**void**)
{
   process...
}
是否必须在每个函数末尾使用“return”

示例2:

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

   **return;**
}
void Function(**void**)
{
   process...
}
如果我没有收到任何值,是否需要在参数列表中使用“void”

有些人说不,有些人说是。
对于编译器和C语言中的最佳实践有什么好的理解?

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


void
由于参数不是必须的,它只表示没有传递任何参数

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

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

但最好确切地指定要返回的值

为了回应cool guys的评论,以下代码使用带有标志的
-std=c89
-std=c99
-std=c11
编译:

#include <stdio.h>

int main(void) {
  printf("Hello world\n");
}
#包括
内部主(空){
printf(“Hello world\n”);
}

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

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

  • void类型的未命名参数作为唯一 列表中的项指定函数没有参数
  • 标识符列表仅声明参数的标识符 函数的一部分。函数声明符中的一个空列表 对该函数定义的定义指定该函数没有 参数。函数声明符中不属于一部分的空列表 该函数的定义的定义指定没有关于 提供了参数的数量或类型。145)
  • 脚注145涉及“未来方向§6.11.6”和“使用带空括号的函数声明符(非原型格式参数 类型声明器)是过时的功能。“

    因此声明

    void f( void );
    
    表示函数没有参数

    声明

    void f();
    
    表示参数的数量和类型未知

    同时也是一个定义的声明

    void f()
    {
    }
    
    表示函数没有参数


    对于返回类型为
    void
    的函数中的return语句,如果它是该函数的最后一条语句,则通常会忽略它。使用最后一个return语句只会让代码的读者感到困惑,因为他必须确保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函数调用也会说“如果参数的数量不等于参数的数量,则行为是未定义的。”(并且
    func
    是使用1个参数调用的,但没有参数)


    C11标准n1570工作草案规定如下:

    6.11.6功能声明器

  • 使用带空括号的函数声明符(不是原型格式参数 类型声明器)是一种过时的功能
  • (有趣的事实:标准本身在其示例中使用了
    int main()


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

    标准草案说:

  • A 返回 语句终止当前函数的执行并将控制权返回给 它的呼叫者。一个函数可以有任意数量的 返回 声明
  • 此处的Any表示返回值的函数或不返回值的函数(返回
    void
    )都不允许有
    return
    语句

    功能声明草案中的6.9.1规定:

  • 如果
    }
    到达终止函数的,函数调用的值由 调用方的行为未定义

  • 因此,如果函数返回一个值(而不是
    void
    ),并且调用者使用该值,则省略return语句是未定义的行为。(作为例外,该标准还规定,在
    main()
    中省略
    return
    语句现在相当于返回0)当使用void作为函数返回类型时,不需要返回任何值。换句话说,如果你想返回一些东西,那么你应该使用特定的数据类型当使用
    void
    时,这意味着没有要返回的值。因此您不必返回任何值,
    return等于什么也不返回。当您没有提到