Существует ли прагма FENV_ACCESS в C ++ 11 и выше?

Чтение отчета об ошибке для Clang не поддерживает прагму FENV_ACCESS Я встретил комментарий:

Настройка режима округления без использования #pragma STDC FENV_ACCESS ON вызывает неопределенное поведение. См. C11 7.6.1 / 2. (Эта прагма не существует в C ++, поэтому <cfenv> непригоден, но это не наша вина …)

Эта прагма действительно не существует в C ++, рендеринг <cfenv> непригодный для использования? Я пытался найти его в стандарте C ++ 11, но на самом деле он вообще не упоминается. Прагмы наследуются от C вместе с прототипами функций? Или они на самом деле не нужны, чтобы избежать UB, поскольку стандарт C ++ ничего не говорит о том, что поведение не определено, когда прагма не используется (из-за того, что прагма вообще не упоминается)?

2

Решение

Я искал черновик текста 2015 года и не обнаружил ни одного случая FENV_ACCESS. http://cppreference.com также не имеет ничего об этом.

Тем не мение, http://cplusplus.com действительно упоминает об этом (поскольку это не в стандарте, я думаю, мы должны предположить, что это в лучшем случае консультативная информация):

http://www.cplusplus.com/reference/cfenv/FENV_ACCESS/

Цитата из cplusplus.com: (выделено мое)

Если этот параметр включен, программа информирует компилятор о том, что он может получить доступ к среде с плавающей запятой для проверки своих флагов состояния (исключений) или запуска в режимах управления, отличных от режима по умолчанию.

Если установлено значение off, компилятор может выполнять определенные оптимизации, которые могут подорвать эти тесты и изменения режима, и, таким образом, доступ к среде с плавающей точкой в ​​описанных выше случаях вызывает неопределенное поведение.

Включение или отключение состояния этой прагмы по умолчанию зависит от настроек компилятора и реализации библиотеки.

Принимая во внимание тревожное отсутствие ясности, я хотел бы избежать его использования, если это вообще возможно.

Как всегда, если бы использование было неизбежным, я бы хотел заключить его в один класс, который я могу специализировать и тестировать для каждой архитектуры.

А затем документируйте существование этого класса и проблемы, которые он может вызвать, если обновится реализация компилятора, среды или библиотеки.

Обновить:

В стандарте c ++ очень кратко упоминается заголовок:

§ 26.3 Среда с плавающей точкой [cfenv]

2 Заголовок определяет все функции, типы и макросы так же, как в разделе 7.6 стандарта C.

Обновить:

Дополнительная информация здесь: http://en.cppreference.com/w/cpp/preprocessor/impl

Насколько я понимаю, прагма определяется стандартом C11, а не стандартом C ++ 11. Поэтому использование в программе на c ++ строго реализовано / не определено.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]