精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。
C++ 17 __has_include具有用于测试可用标头的新功能。新标准使得使用宏常量预处理器符或预处理表达式来检查给定标头是否存在成为可能。
这个功能能够减少预编译宏#的使用,减少代码输入量,不过需要初学者能够正常配置开发环境,如果开发环境没有配置好头文件目录,用起来有问题。另外还有细小的问题可能,就是换了开发环境,如果自己编写的类名和系统的类名冲突,自己的头文件又没有移动过去,__has_include是不会报告打开文件失败,这要尤其注意。
为避免重新包含相同的文件和无限递归,通常使用头文件保护:
#ifndef MyFile_H
#define MyFile_H
// contents of the file here
#endif
但是,我们现在可以使用预处理器的常量表达式,如下所示:
#if __has_include (<header_name>)
#if __has_include ("header_name")
例如,当我们需要编写可移植代码并在编译时检查我们需要获取哪些头文件时,具体取决于操作系统,而不是使用这样的代码:
#ifdef _WIN32
#include <tchar.h>
#define the_windows 1
#endif
#if (defined(linux) || defined(__linux) || defined(__linux__) ||
defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)
#include <unistd.h>
#endif
#include <iostream> int main() {
#ifdef the_windows
std::cout << "This OS is Windows";
#else
std::cout << "This OS is Linux";
#endif
return 0;
}
在 С++17 中,我们可以将__has_include宏用于相同的目的:()
#if __has_include(<tchar.h>)
#include <tchar.h>
#define the_windows 1
#endif
#if __has_include(<unistd.h>)
#include <unistd.h>
#endif
#include <iostream>
int main() {
#ifdef the_windows
std::cout << "This OS is Windows";
#else
std::cout << "This OS is Linux";
#endif
return 0;
}