c++ 17扩展了预处理器,使其能够检查是否包含特定的头文件。
例如:
#if __has_include(<filesystem>)
# include <filesystem>
# define HAS_FILESYSTEM 1
#elif __has_include(<experimental/filesystem>)
# include <experimental/filesystem>
# define HAS_FILESYSTEM 1
# define FILESYSTEM_IS_EXPERIMENTAL 1
#elif __has_include("filesystem.hpp")
# include "filesystem.hpp"
# define HAS_FILESYSTEM 1
# define FILESYSTEM_IS_EXPERIMENTAL 1
#else
# define HAS_FILESYSTEM 0
#endif
来个简单的例子:
#include <iostream>
int main()
{
#if __has_include(<cstdio>)
printf("c program");
#endif
#if __has_include("iostream")
std::cout << "c++ program" << std::endl;
#endif
return 0;
}
如果相应的#include命令有效,那么_has_include(…)中的条件的值为1 (true)。