锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源社区 / c++17 __has_include理解和示例

服务方向

人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发

联系方式

固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。


c++17 __has_include理解和示例


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;
}
友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近