C++1zから、インクルードするファイルが存在するかを確認するプリプロセッサ機能が追加されます。
__has_include
式の引数として、ダブルクォーテーションで囲まれたインクルードファイル名、山カッコで囲まれたインクルードファイル名、もしくはプリプロセッサトークン名を指定することで、プリプロセス時にそのファイルが存在するかを#if
/#elif
で確認できます。
// <optional>ヘッダが存在していたらインクルードする #if __has_include(<optional>) #include <optional> #endif
// "optional"ヘッダが存在していたらインクルードする #if __has_include("optional") #include "optional" #endif
#define OPTIONAL_HEADER <optional> // <optional>ヘッダが存在していたらインクルードする #if __has_include(OPTIONAL_HEADER) #include OPTIONAL_HEADER #endif
参照
- P0061R0 Feature-testing preprocessor predicates for C++17
- P0061R1
__has_include
for C++17 - ヘッダファイルが存在するかどうかをチェックする(Clang)
- GCC 5.0のC++関係機能
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。