我有一个程序,引用了“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 ++预处理程序指令来做到这一点?
你应该只是做
#include "nvml.h"
设置包括路径,同时根据平台的编译:
g++ -I/usr/local/cuda/include ...
但我不认为通过我可以使用IF / DEF结构来检查文件的存在的方法。有没有办法在C ++预处理程序指令来做到这一点?
由于C ++ 17中,在宏__has_include
这正是这一点。
之前C ++ 17,有一个在标准没有这样的指令,虽然可能已被支持作为一个扩展。编译器可以支持的命令行参数来提供宏定义,其可用于以转发在编译之前存在性的检查的结果。
这就是说,对于您的特定情况下,它可能是最好只包括<nvml.h>
并添加父目录,包括路径。见你的编译器的手册细节 - 或使用一个构建系统来照顾它。
要做到这一点,最好的方法是定义一个驱动文件是否被包括或不包括宏:
#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,绝对路径一般要避免。我只是让他们在那里为了回答这个问题的任择议定书要求它,这是一个独立的问题。