feraiseexcept: различное поведение между компиляторами и отсутствие документации для поведения, определяемого реализацией

Пример кода (t91.c):

      #include <stdio.h>
#include <fenv.h>

#if _MSC_VER
#pragma fenv_access (on)
#else
#pragma STDC FENV_ACCESS ON
#endif

void show_fe_exceptions(void)
{
    printf("exceptions raised:");
    if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO");
    if(fetestexcept(FE_INEXACT)) printf(" FE_INEXACT");
    if(fetestexcept(FE_INVALID)) printf(" FE_INVALID");
    if(fetestexcept(FE_OVERFLOW)) printf(" FE_OVERFLOW");
    if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW");
    if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none");
    printf("\n");
}
int main(void)
{
    feraiseexcept(FE_OVERFLOW);
    show_fe_exceptions();
    return 0;
}

Призывы:

      $ clang t91.c -Wall -Wextra -pedantic && ./a.exe
t91.c:7:14: warning: pragma STDC FENV_ACCESS ON is not supported, ignoring pragma [-Wunknown-pragmas]
#pragma STDC FENV_ACCESS ON
             ^
1 warning generated.
exceptions raised: FE_OVERFLOW

$ gcc t91.c -Wall -Wextra -pedantic && ./a.exe
t91.c:7: warning: ignoring ‘#pragma STDC FENV_ACCESS’ [-Wunknown-pragmas]
    7 | #pragma STDC FENV_ACCESS ON
      |
exceptions raised: FE_OVERFLOW

$ cl t91.c /fp:strict && t91
exceptions raised: FE_INEXACT FE_OVERFLOW

ISO / IEC 9899:2011 (E):

7.6.2.2 Функция fegetexceptflag

Будет ли функция feraiseexcept дополнительно вызывать исключение «неточного» числа с плавающей запятой всякий раз, когда оно вызывает исключение «переполнение» или «недополнение» с плавающей запятой, определяется реализацией.

Однако документация для gcc и документация для Microsoft C не документируют (или я не могу ее найти) точное поведение feraiseexceptфункция. Обратите внимание, что Clang / LLVM документирует свое поведение, определяемое реализацией, непосредственно через исходный код .

Также реализация , соответствующая стандарту ISO C, должна сопровождаться документом, в котором определены все характеристики, определяемые реализацией и локали, а также все расширения (ISO / IEC 9899:2011 (E), раздел 4, параграф 8).

Вопрос (наконец!): Почему реализации C не документируют все характеристики / поведение, определенные реализацией?

0 ответов

Другие вопросы по тегам