考虑以下使用__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
会意外失败。
答案 0 :(得分:4)
虽然我认为这是一个特定于实现的问题,this #include
reference说
__has_include
1
结果仅表示存在具有指定名称的标头或源文件。这并不意味着头文件或源文件(如果包含在内)不会导致错误或包含任何有用的内容。
因此,您不应指望随后的#include
指令成功。
上面的链接引用实际上继续上面的引用,并提到具有C ++ 14和C ++ 17模式的编译器可以将__has_include
作为其C ++ 14模式的扩展,并举例说明仅使用<optional>
可以导致__has_include(<optional>)
在C ++ 14模式下成功,但实际的#include
失败。