当它不应该时,函数突然返回

时间:2010-08-10 21:36:11

标签: c++ c debugging gdb

我正在为我的一个暑期课程进行操作系统任务。教师提供了一个目标文件,该文件提供模仿磁盘设备驱动程序行为的功能。然后我们编写一个文件系统API,它使用C中的磁盘设备驱动程序。

我正在处理名为Format()的文件系统格式函数,该函数从教师对象文件中调用名为DevFormat()的函数。如果能够成功格式化文件系统,我的函数应返回1,否则返回0。如果DevFormat()能够成功格式化磁盘驱动器,则返回1,否则返回0。这是代码:

int Format()
{
    if (!DevFormat())
    {
        printf("Disk drive wasn't formatted successfully\n");
        return 0;
    }

    <Do some stuff to the file system here>

    printf("File system successfully formatted\n");
    return 1;
}

我的问题是Format()突然结束而没有返回值。我发现有问题的代码是行if (!DevFormat())。现在我正在用C编写作业,但我正在使用GNU C ++(g ++)编译器来编译和链接我的项目,就像老师说的那样。我想说,执行行if (!DevFormat())时,Format()突然结束的原因必须与编译器对我的代码的解释做一些事情(我可能会离开。这只是猜测。)。我发现如果我将代码更改为if (0 == DevFormat()),我的函数也会突然结束。我可以测试失败的唯一方法是将DevFormat()的返回值赋给int变量,然后检查它。

非常感谢任何帮助。这与C ++编译器解释我的代码的方式有关吗?难道我错过了一些平凡的东西,以至于我应该为自己感到羞耻吗?

再次感谢您的帮助。

3 个答案:

答案 0 :(得分:14)

我想也许你已经忘记了if语句的括号 - 我想你想写这个:

if (!DevFormat()) {
    printf("Disk drive wasn't formatted successfully\n");
    return 0;
}

只有printf语句在if块内,所以无论DevFormat()的返回值如何,每次都会执行return语句。这是C中常见的问题:)

答案 1 :(得分:0)

那肯定会是一个错误,但我在上面的代码中没有看到任何缺失的大括号 - 是否已被编辑过?

答案 2 :(得分:0)

尝试使用gcc -fno-exceptions进行编译,看看是否有任何改变。 (也是为了确保库的名称。)另外,我第二次@ tholomew要求详细说明“格式()突然结束而不返回值。”。