2017-06-13 411 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

相關問題