2017-06-13 13 views
3

__has_include()を使用して、次のC++コード1Z考えてみましょう:__has_include()とそれに続く#includeの間に競合条件が存在することはありますか?

#if __has_include(<optional>) 
# include <optional> 
# define have_optional 1 
#else 
# define have_optional 0 
#endif 

__has_include(<optional>)、その後の#include <optional>または標準保証レースのない行動をする間の競合状態が存在することはできますか?たとえば、__has_include()チェックの直後にヘッダーファイルが削除される(起こりにくい)状況では、#includeが予期せず失敗します。

答えて

4

私はそれが非常に多く、実装固有の問題だと主張するだろうが、this #include reference1__has_include結果のみが指定された名前のヘッダまたはソースファイルが存在することを意味

言います。ヘッダーまたはソースファイルをインクルードすると、エラーが発生しないか、有用なものが含まれることを意味するわけではありません。

これに続く#include指示にはカウントしないでください。

上記のリンクされたリファレンスは、C++ 14モードとC++ 17モードの両方を持つコンパイラがC++ 14モードの拡張として__has_includeを持つことができ、 <optional>は、__has_include(<optional>)をC++ 14モードで成功させることができますが、実際には#includeは失敗します。

+1

ええ、私もそうだと思います。スタンダードは本当にあまり言及していません。 http://eel.is/c++draft/cpp.cond#4の最後の文章がこれをサポートしているようです。 – Rakete1111

関連する問題