gcc(Linux/MinGW)是否存在编译器标志,以便在运行时引发除以零的错误

Does a compiler flag exist for gcc (Linux/MinGW) to raise a division by zero error at run time?

本文关键字:运行时 错误 MinGW Linux 是否 标志 编译器 存在 gcc      更新时间:2023-10-16

我有一个用C++编写的复杂模型,其中分母有时恰好是零。我通常会检查它们,但当我忘记的时候,调试它们会很痛苦,因为模型在没有警告的情况下继续运行。

有没有一个编译器标志,在linux上的最新版本的gcc和windows上的MinGW中都可以使用,我可以用它来告诉gcc进行编译,以便在发生(双精度之间)除以零时引发运行时错误?这在计算上是昂贵的吗(所以只在调试构建中启用它)?

我知道这里也发布了一个类似的问题,但答案更多的是技术和理论上的快速评论,而不是一个成熟的答案。

对于linux中的gcc,您可以使用fenv.h,或者由于c++11 cfenf和windows上有_controlfp

目前我能找到的最好的方法是在Linux中进行检查,并在MinGW中忽略它(_controlfp似乎对我的安装不起作用)。这在我的用户案例中不是问题,因为开发无论如何都是在Linux中进行的:

#include <iostream>
#ifdef  __GNUC__
#ifndef __MINGW32__
//#define _GNU_SOURCE // contrary to other answers, this seems no longer  needed as defined by default
#include <fenv.h>
#endif
#endif
int main(int argc, char* argv[]){
#ifdef  __GNUC__
#ifndef __MINGW32__
  feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
#endif
#endif
  double num = 4.0;
  double den = 0.0;
  double ratio = num/den;
  std::cout << "ratio: " << ratio << std::endl;
}