__has_include()和后续#include之间是否存在竞争条件?

时间:2017-06-13 11:31:58

标签: c++ c++17

考虑以下使用__has_include()的C ++ 1z代码:

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

__has_include(<optional>)和随后的#include <optional>之间是否存在竞争条件,或标准是否保证无种族行为?例如,在__has_include()检查后立即删除头文件的(不可能的)情况下,#include会意外失败。

1 个答案:

答案 0 :(得分:4)

虽然我认为这是一个特定于实现的问题,this #include reference

  

__has_include 1结果仅表示存在具有指定名称的标头或源文件。这并不意味着头文件或源文件(如果包含在内)不会导致错误或包含任何有用的内容。

因此,您不应指望随后的#include指令成功。

上面的链接引用实际上继续上面的引用,并提到具有C ++ 14和C ++ 17模式的编译器可以将__has_include作为其C ++ 14模式的扩展,并举例说明仅使用<optional>可以导致__has_include(<optional>)在C ++ 14模式下成功,但实际的#include失败。