【问题标题】:Borland C++ What wil this bool function return?Borland C++ 这个 bool 函数会返回什么?
【发布时间】:2012-11-20 12:23:14
【问题描述】:
bool SomeFunction()
{

}

我无法在我的机器上运行 Borland C++,但我需要从 C++ 转换为 VB,因此需要有关此功能的帮助。

【问题讨论】:

  • 嗯嗯嗯,bool?
  • 这将导致未定义的行为。
  • 您是否在问 Borland C++ 编译器会选择为这段未定义的代码返回什么?
  • 是的,我想知道 Borland C++ 编译器会返回什么 :)
  • 未定义的行为...很好的问题我有一个补充,将 bool 更改为 float 或 double ...它会损坏 FPU 堆栈,导致 FPU 操作中的随机错误(在任何地方使用 FPU)这个函数)对于非 FPU 类型是安全的(不正确但安全)......当我发现这个时,我花了很多时间调试。

标签: c++ borland-c++


【解决方案1】:

该函数声称它返回一个bool,但它什么也没返回。这应该会导致编译器警告。如果你用它来赋值调用函数,结果将是未定义的行为:

bool b = SomeFunction(); // UB, SomeFunction is failing to return.
SomeFunction(); // still undefined behaviour

只允许main()不显式返回,在这种情况下它隐式返回0

看这里:

§6.6.3/2:

从函数的末尾流出相当于没有值的返回;这会在返回值的函数中导致未定义的行为。

【讨论】:

  • 抱歉上面的评论我发错了。谢谢您的回答。实际上有一个像 Try { int ret = SomeFunction() if (ret) { //do sth .... ... .. 的代码。 } } Catch { MessageDlg("Error".....) } 它没有去捕捉(没有错误消息弹出),我不知道它是否进入了 if 子句?我没有编写 C++ 部分,所以我尝试了解它是如何工作的,以便将其转换为 VB。
  • @user1838718 您可以编辑您的问题以添加代码 sn-p。它看起来仍然像未定义的行为,因为它可以从最后流出。
【解决方案2】:

我在 Borland XE2 上编译了以下代码:

bool SomeFunction()
{
}

int main()
{
    bool x = SomeFunction();
    // ...
}

SomeFunction() 翻译成以下 x86 汇编代码:

push ebp
mov ebp,esp
pop ebp
ret

main() 中的作业翻译为:

call SomeFunction()
mov [ebp-$31],al

其中[ebp-$31]x 的位置。这意味着,al 寄存器的内容将在bool x 中结束。如果al 为0,x 将为假,否则x 将为真。在我的系统上,这总是正确的,但这取决于上下文。此外,您可能会得到不同的调试和发布结果。

当然,结论是 x 是未定义的。给定的代码有点像写

bool x;
if (x)
{
    // ...
}

我倾向于认为SomeFunction() 的定义不仅应该触发编译器警告,还应该触发错误。 Visual C++是这样的,其他的编译器我就不知道了。

【讨论】:

    【解决方案3】:

    应该是return true;return false;

    bool SomeFunction()
    {
    
        return true;
    
        // or
    
        return false;
    
    }
    

    如果您的编译器没有内置 bool,那么您可以这样做:

    typedef int bool;
    #define true 1
    #define false 0
    
    int main(void)
    {
    
        bool answer;
        answer = true;
    
        while(true)
        {
    
        }
    
       return 0;
    }
    

    【讨论】:

    • 如果你的编译器不支持 bool,你应该开始使用更好的编译器,bool 在 C++ 中已经存在很长时间了,它不是全新的火箭科学。编写这样的代码是一个糟糕的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2017-02-11
    • 2020-02-21
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多