有条件地将文件包含在C++标头中

Conditionally Include File in C++ Header

本文关键字:C++ 文件包 有条件      更新时间:2023-10-16

我有一个程序引用"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