3

FENV_ACCESSプラグマをサポートしていないclangのバグレポートを読んで、コメントに出くわしました:

を使用せずに丸めモードを設定すると、#pragma STDC FENV_ACCESS ON未定義の動作が呼び出されます。C11 7.6.1/2 を参照してください。(このプラグマは C++ には存在しないため、<cfenv> は使用できませんが、それは私たちのせいではありません...)

このプラグマは本当に C++ に存在せず、<cfenv>使用できなくなるのでしょうか? C++11 標準で検索しようとしましたが、実際にはまったく言及されていません。プラグマは関数プロトタイプと共に C から継承されますか? それとも、プラグマが使用されていないときの動作が未定義であることについてC++標準は何も言っていないので、実際にはUBを回避する必要はありません(プラグマについてまったく言及していないため)?

4

1 に答える 1

1

2015 年の標準ドラフト テキストを検索したところ、FENV_ACCESS の出現は見つかりませんでした。http://cppreference.comにもそれについて何もありません。

ただし、http://cplusplus.comでは言及されています (標準に含まれていないため、これはせいぜい助言情報であると想定する必要があると思います)。

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

cplusplus.com からの引用: (強調は私のものです)

on に設定すると、プログラムは、浮動小数点環境にアクセスしてステータス フラグ (例外) をテストするか、デフォルト以外の制御モードで実行する可能性があることをコンパイラに通知します。

オフに設定すると、コンパイラは特定の最適化を実行する可能性があり、これらのテストとモードの変更を覆す可能性があるため、上記のケースで浮動小数点環境にアクセスすると、未定義の動作が発生します

このプラグマのデフォルトの状態がオンかオフかは、コンパイラの設定とライブラリの実装によって異なります。

不安なほどの明確さの欠如を考えると、可能であればその使用を避けたいと思います.

いつものように、使用が避けられない場合は、アーキテクチャごとに特化してテストできる 1 つのクラスにカプセル化する必要があります。

次に、このクラスの存在と、コンパイラ、環境、またはライブラリの実装がアップグレードされた場合に発生する可能性のある問題を文書化します。

アップデート:

C++ 標準には、ヘッダーに関する非常に簡単な説明があります。

§ 26.3 浮動小数点環境 [cfenv]

...

2 ヘッダーは、C 標準の 7.6 節と同じように、すべての関数、型、およびマクロを定義します。

アップデート:

詳細はこちら: http://en.cppreference.com/w/cpp/preprocessor/impl

これについての私の解釈は、プラグマが C++11 標準ではなく、C11 標準によって定義されているということです。したがって、c++ プログラムでの使用は厳密に実装/未定義です。

于 2016-03-25T12:12:59.870 に答える