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



考虑以下使用__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失败。

最新更新