2017-06-13 403 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 reference

1一个__has_include结果不仅意味着具有指定名称的头或源文件是否存在。这并不意味着包含的头文件或源文件不会导致错误或包含任何有用的东西。

所以你不应该指望后续的#include指令成功。

上面的链接引用实际上延续了上面的引用,提到一个具有C++ 14和C++ 17模式的编译器可以将__has_include作为其C++ 14模式的扩展, <optional>可能导致__has_include(<optional>)在C++ 14模式下成功,但实际上#include失败。

+1

是的,我也这么认为。该标准没有提到太多。 http://eel.is/c++draft/cpp.cond#4中的最后一句似乎支持这一点。 – Rakete1111

相关问题