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