2016-03-25 4 views
2

Чтение отчета об ошибке clang not supporting FENV_ACCESS pragma я пришел через comment:Существует ли FENV_ACCESS прагма в C++ 11 и выше?

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

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

+0

Это потребует свертывания ваших рукавов и записи и отправки патча для LLVM. Приятно, когда открытый исходный код позволяет исправить эти вещи. –

+0

@ HansPassant Что вы имеете в виду? Как патч для LLVM может решить проблему в стандарте? – Ruslan

ответ

1

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

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

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

Цитирование из cplusplus.com: (курсив мой)

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

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

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

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

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

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

Update:

Существует очень краткое упоминание о заголовке в C++ стандарт:

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

...

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

Update:

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

Мое чтение этого является то, что прагма определяется стандартом C11, а не стандартный С ++ 11. Поэтому использование в программе C++ строго выполняется/не определено.

+0

[cppreference] (http://en.cppreference.com/w/cpp/preprocessor/impl) упоминает его под словами «Следующие три прагмы определены стандартом языка С.». cplusplus.com, похоже, утверждает, что они работают на C++, но это утверждение кажется необоснованным. – Ruslan

+0

@ Руслан, возможно, лучшая формулировка «может или не может работать в зависимости от вашей реализации»? –

+0

Означает ли это, что это дефект языка, о котором следует сообщать и фиксировать? – Ruslan