有条件地包含在C ++头文件

问题描述 投票:-2回答:3

我有一个程序,引用了“nvml.h”文件,以执行代码的某些部分。在我的Linux机器,这是通过在头文件中的以下行来实现:

#include "/usr/local/cuda/include/nvml.h"

不过,我希望用户能够运行,即使这个文件并不在其系统上存在的程序。我已经使程序模块化的,因此这是可以实现的,但我仍然需要一些方法,通过它我可以检查文件是否存在于所有,如果没有,从包括它在我的头文件中投弃权票。

我为了得到它的工作在Windows和Linux都试过了IF / DEF语句:

#if defined(Q_OS_UNIX)
#include "usr/local/cuda/include/nvml.h"
#else
#include "C:/Users/thisUser/nvml.h"

但我不认为通过我可以使用IF / DEF结构来检查文件的存在的方法。有没有办法在C ++预处理程序指令来做到这一点?

c++ preprocessor
3个回答
2
投票

你应该只是做

#include "nvml.h"

设置包括路径,同时根据平台的编译:

g++ -I/usr/local/cuda/include ...

2
投票

但我不认为通过我可以使用IF / DEF结构来检查文件的存在的方法。有没有办法在C ++预处理程序指令来做到这一点?

由于C ++ 17中,在宏__has_include这正是这一点。

之前C ++ 17,有一个在标准没有这样的指令,虽然可能已被支持作为一个扩展。编译器可以支持的命令行参数来提供宏定义,其可用于以转发在编译之前存在性的检查的结果。


这就是说,对于您的特定情况下,它可能是最好只包括<nvml.h>并添加父目录,包括路径。见你的编译器的手册细节 - 或使用一个构建系统来照顾它。


-1
投票

要做到这一点,最好的方法是定义一个驱动文件是否被包括或不包括宏:

#if defined(USE_CUDA_NVML)
#include "/usr/local/cuda/include/nvml.h"
#else
#include "C:/Users/thisUser/nvml.h"
#endif

然后,用户可以通过定义标记选择加入条件的特点:

gcc -DUSE_CUDA_NVML main.cpp

编辑:正如评论者mentionned,绝对路径一般要避免。我只是让他们在那里为了回答这个问题的任择议定书要求它,这是一个独立的问题。

© www.soinside.com 2019 - 2024. All rights reserved.