使用返回0;in void 函数是否可能?

pea*_*per 2 c

我最近在 code::blocks 中使用 C 编程向我的导师提交了一个大数乘法和除法项目。在代码中间,我错误地使用了 return 0; 在空函数中:

void division_function (char str1[MAX_STR_LEN], char str2[MAX_STR_LEN])
{
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int num1[len1];
    int num2[len2];

    // In case the second number has more digits:
    if (len2 > len1)
    {
        printf("\nResult of division = 0");
        printf("\nRemainder = %s ", str1);
        return 0 ;
    }
    //rest of the code
Run Code Online (Sandbox Code Playgroud)

无论如何,在提交后,讲师给我发邮件说,由于使用了 void 函数中的 return a value ,代码失败了!我知道我应该使用 (return;) 而不是 (return 0;) 因为 void 函数不返回任何内容!我的问题是为什么我的控制台中没有出现任何错误!我只是测试了这段代码:

#include <stdio.h>
#include <stdlib.h>
void function ();
int main()
{
    function();
    return 0;
}
void function ()
{
    printf("OK");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我再次没有收到错误,输出也正常。这次我的问题是没有收到我应该收到的错误!

Bat*_*eba 6

标准C 中,不可能对函数return执行任何void操作 - 编译器需要发出诊断。

此外,如果函数是 non- void,那么您必须返回相同类型或隐式可转换为返回类型的内容。此规则的例外情况是,如果缺少,main编译器将插入隐式。return 0;

请注意,在 C 中,您应该将函数原型标记为具有void参数:

void function (void);
Run Code Online (Sandbox Code Playgroud)

这是 C 和 C++ 之间的一个重要区别。

除非您可以配置编译器,使其在这种情况下编译失败,否则它是有缺陷的,您应该考虑切换它。


Lun*_*din 5

您确实收到了警告,但您选择忽略该警告。Codeblocks 默认安装是 gcc/mingw,它会给出以下警告:

警告:“返回”带有一个值,在函数中返回 void

如果使用 编译-pedantic-errors,则会出现错误。


对于初学者的建议设置是进入“设置”->“编译器”,检查以下选项:

  • 启用所有常见编译器警告 (-Wall)
  • 启用额外的编译器警告 (-Wextra)
  • 将严格 ISO C 要求的警告视为错误(-pedantic-errors)

最好还应该添加一个-std=c11我认为 Codeblocks 中默认不存在的选项。