Spec-Zone.ru › C

fegetexceptflag, fesetexceptflag

Определено в заголовке <fenv.h>
int fegetexceptflag( fexcept_t* flagp, int excepts );
(1) (с C99)
int fesetexceptflag( const fexcept_t* flagp, int excepts );
(2) (с C99)

1) Попытка получить полное содержимое флагов исключений с плавающей запятой, которые перечислены в битовой маске аргумента excepts, представляющей собой побитовое ИЛИ макросов исключений с плавающей запятой.

2) Попытка скопировать полное содержимое флагов исключений с плавающей запятой, перечисленных в excepts из flagp в среду с плавающей запятой. Не вызывает никаких исключений, только изменяет флаги.

Полное содержимое флага исключения с плавающей запятой необязательно является булевым значением, указывающим на то, было ли исключение вызвано или очищено. Например, это может быть структура, включающая булевый статус и адрес кода, вызвавшего исключение. Эти функции получают всё это содержимое и получают/хранят его в flagp в формате, определяемом реализацией.

Параметры

flagp - указатель на объект fexcept_t , где будут храниться или считываться флаги
excepts - битовая маска, перечисляющая флаги исключений для получения/установки

Возвращаемое значение

​0​ при успехе, ненулевое значение в противном случае.

Пример

#include <stdio.h>
#include <fenv.h>
 
#pragma STDC FENV_ACCESS ON
 
void show_fe_exceptions(void)
{
    printf("current 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)
{
    fexcept_t excepts;
 
    /* Setup a "current" set of exception flags. */
    feraiseexcept(FE_INVALID);
    show_fe_exceptions();
 
    /* Save current exception flags. */
    fegetexceptflag(&excepts,FE_ALL_EXCEPT);
 
    /* Temporarily raise two other exceptions. */
    feclearexcept(FE_ALL_EXCEPT);
    feraiseexcept(FE_OVERFLOW | FE_INEXACT);
    show_fe_exceptions();
 
    /* Restore previous exception flags. */
    fesetexceptflag(&excepts,FE_ALL_EXCEPT);
    show_fe_exceptions();
 
    return 0;
}

Вывод:

current exceptions raised: FE_INVALID
current exceptions raised: FE_INEXACT FE_OVERFLOW
current exceptions raised: FE_INVALID

Ссылки

  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.6.2.2 Функция fegetexceptflag (стр: 210)
    • 7.6.2.4 Функция fesetexceptflag (стр: 211)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.6.2.2 Функция fegetexceptflag (стр: 191)
    • 7.6.2.4 Функция fesetexceptflag (стр: 192)

См. также

Документация C++ для fegetexceptflag, fesetexceptflag

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/fenv/feexceptflag

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API