Условно включить файл в заголовок C ++ - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть программа, которая ссылается на файл «nvml.h» для выполнения некоторой части кода.На моем компьютере с Linux это достигается путем добавления в заголовочный файл следующей строки:

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

Однако я хочу, чтобы пользователь мог запускать программу, даже если этот файл не существует в их системе.,Я сделал программу модульной, чтобы это можно было выполнить, но мне все еще нужен какой-то метод, с помощью которого я могу проверить, существует ли файл вообще и, если нет, воздержаться от включения его в мой заголовочный файл.

Iпопробовал оператор 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 ++?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вы должны просто

#include "nvml.h"

установить путь включения при компиляции в зависимости от платформы:

g++ -I/usr/local/cuda/include ...
0 голосов
/ 07 февраля 2019

Но я не могу придумать метод, с помощью которого я могу использовать структуру IF / DEF для проверки существования файла.Есть ли способ сделать это с помощью директив препроцессора в C ++?

Начиная с C ++ 17, существует макрос __has_include, который делает именно это.

До C ++17, в стандарте не было такой директивы, хотя, возможно, ее поддерживали как расширение.Компилятор может поддерживать аргумент командной строки для предоставления определений макросов, которые можно использовать для пересылки результата проверки на существование до компиляции.


Тем не менее, для вашего конкретного случая может быть лучшепросто включить <nvml.h> и добавить родительский каталог, чтобы включить путь.Подробности смотрите в руководстве к вашему компилятору - или используйте систему сборки, чтобы позаботиться об этом.

0 голосов
/ 07 февраля 2019

Лучший способ сделать это - определить макрос, который определяет, будет ли файл включен или нет:

#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

Редактировать: Как отмечают комментаторы, в целом следует избегать абсолютных путей.Я просто держал их там, чтобы ответить на вопрос, заданный ОП, что является отдельным вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...