使用return 0;在无效的功能可能吗?

时间:2018-11-01 08:35:49

标签: c

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

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

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

#include <stdio.h>
#include <stdlib.h>
void function ();
int main()
{
    function();
    return 0;
}
void function ()
{
    printf("OK");
    return 0;
}
再次

我没有错误,输出正常。 这次我的问题没有得到似乎应该得到的错误!

2 个答案:

答案 0 :(得分:4)

standard C中,无法使用return函数void进行任何操作-编译器必须发出诊断信息。

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

请注意,在C语言中,应将函数原型标记为具有void function (void); 个参数:

   trace(os.time(os.date('!*t'))) 
   trace(os.time(os.date('*t')))
   trace(os.time(os.date('!%c')))

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

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

答案 1 :(得分:4)

您确实收到一条警告,您选择忽略它。 Codeblocks的默认安装是gcc / mingw,它会发出以下警告:

  

警告:函数返回void时,返回一个带有值的值

如果使用-pedantic-errors进行编译,则会变成错误。


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

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

最好还应添加一个选项-std=c11,我认为代码块默认不存在该选项。