-O1/2/3 with -std=c++1y/11/98 - If is included i'm getting error: '_hypot' was not declared in this scope

前端 未结 3 713
孤独总比滥情好
孤独总比滥情好 2020-12-10 05:22

I\'ve just updated MinGW using mingw-get-setup and i\'m unable to build anyting that contains header if I use anything larger than

相关标签:
3条回答
  • 2020-12-10 06:03

    As noted by Keith, this is a bug in the MinGW.org header.

    As an alternative to editing the MinGW.org header, you can use MinGW-w64, which provides everything MinGW.org provides, and a whole lot more. For a list of differences between the runtimes, see this wiki page.

    0 讨论(0)
  • 2020-12-10 06:10

    MinGW uses gcc and the Microsoft runtime library. Microsoft's implementation support C90, but its support for later versions of the C standard (C99 and C11) is very poor.

    The hypot function (along with hypotf and hypotl) was added in C99.

    If you're getting this error with a program that calls hypot, such as:

    #include <cmath>
    int main() {
        std::cout << std::hypot(3.0, 4.0)) << '\n';
    }
    

    then it's just a limitation of the Microsoft runtime library, and therefore of MinGW. If it occurs with any program that has #include <cmath>, then it's a bug, perhaps a configuration error, in MinGW.

    0 讨论(0)
  • 2020-12-10 06:11

    To avoid any further speculation, and downright bad suggestions such as using #if 0, let me give an authoritative answer, from the perspective of a MinGW project contributor.

    Yes, the MinGW.org implementation of include/math.h does have a bug in its inline implementation of hypotf (float, float); the bug is triggered when compiling C++, with the affected header included (as it is when cmath is included), and any compiler option which causes __STRICT_ANSI__ to become defined is specified, (as is the case for those -std=c... options noted by the OP). The appropriate solution is not to occlude part of the math.h file, with #if 0 or otherwise, but to correct the broken inline implementation of hypotf (float, float); simply removing the spurious leading underscore from the inline reference to _hypot (float, float), where its return value is cast to the float return type should suffice.

    Alternatively, substituting an equivalent -std=gnu... for -std=c... in the compiler options should circumvent the bug, and may offer a suitable workaround.

    FWIW, I'm not entirely happy with MinGW.org's current implementation of hypotl (long double, long double) either; correcting both issues is on my punch list for the next release of the MinGW runtime, but ATM, I have little time to devote to preparing this.

    Update

    This bug is no longer present in the current release of the MinGW.org runtime library (currently mingwrt-3.22.4, but fixed since release 3.22). If you are using anything older than this, (including any of the critically broken 4.x releases), you should upgrade.

    0 讨论(0)
提交回复
热议问题