有条件地将文件包含在C++标头中
Conditionally Include File in C++ Header
我有一个程序引用"nvml.h"文件以执行代码的某些部分。 在我的 Linux 机器上,这是通过在头文件中包含以下行来实现的:
#include "/usr/local/cuda/include/nvml.h"
但是,我希望用户能够运行该程序,即使他们的系统上不存在此文件。 我已经渲染了程序模块化,以便可以完成此操作,但我仍然需要一些方法来检查该文件是否存在,如果不存在,则放弃将其包含在我的头文件中。
我尝试了一个IF/DEF语句,以便让它在Windows和Linux上运行:
#if defined(Q_OS_UNIX)
#include "usr/local/cuda/include/nvml.h"
#else
#include "C:/Users/thisUser/nvml.h"
但是我想不出可以使用 IF/DEF 结构来检查文件是否存在的方法。 有没有办法在C++中使用预处理器指令来做到这一点?
你应该做
#include "nvml.h"
根据平台在编译时设置包含路径:
g++ -I/usr/local/cuda/include ...
但是我想不出可以使用 IF/DEF 结构来检查文件是否存在的方法。有没有办法在C++中使用预处理器指令来做到这一点?
自 C++17 以来,有宏__has_include
正是这样做的。
在C++17之前,标准中没有这样的指令,尽管可能已经支持作为扩展。编译器可以支持命令行参数来提供宏定义,这些宏定义可用于在编译之前转发是否存在检查的结果。
也就是说,对于您的特定情况,最好只包含<nvml.h>
并添加父目录以包含路径。有关详细信息,请参阅编译器的手册 - 或使用构建系统来处理它。
C++17 通过 __has_include
简化了这一点,它提供了仅在系统中找到文件时才有条件地#include
文件的能力。
#if __has_include( <optional> )
# include <optional>
#elif __has_include( <experimental/optional> )
# include <experimental/optional>
#else
//
#endif
相关文章:
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 禁止显示有关包含文件中 #pragma 包的警告
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 如何链接我自己的 .so 文件而不是操作系统捆绑包 .so 文件?
- 使用开发工具包将文件上传到 AWS C++
- TCP-Server以数据包结构(非Java客户端)发送文件
- 致命错误 C1083:无法打开包含文件:'atlbase.h' Pyinsane 包
- 可视化 将 TCP 服务器数据包保存到 C++ 中的文件
- Buildroot 包需要一个带有C++大文件错误的工具链
- 获取包含C++的捆绑包中文件的路径(CFBundleGetMainBundle)
- 数据包大小(每数据包 mBytes)或核心音频中 AAC 文件的比特率
- CMake 包配置文件中的泛型"transitive behavior" (find_dependency)
- Visual Studio 14.0 和 Windows 工具包中的错误包括文件夹
- 获取 PCAP 文件中数据包的 IP 地址
- 如何在 C++ 中读取 PCAP 文件以获取数据包信息
- 如何在C++中分析来自流量转储文件的数据包信息
- 拆包/解密/提取/application.bin文件
- Python:将二进制文件读取到一个结构中,然后拆包
- 如何在visual studio 2010 C++中制作带有所需.dll和lib(opencv)文件的.exe文件包