0
votes

Inclure conditionnellement fichier dans l'en-tête C ++

J'ai un programme qui fait référence à un fichier "nvml.h" afin d'exécuter une partie du code. Sur ma machine Linux, cela est accompli en incluant la ligne suivante dans le fichier d'en-tête: xxx

Cependant, je souhaite que l'utilisateur puisse exécuter le programme même si ce fichier n'existe pas sur leur système. J'ai rendu le programme modulaire de sorte que cela puisse être accompli, mais j'ai toujours besoin d'une méthode permettant de vérifier si le fichier existe du tout et, sinon, s'abstenir de l'inclure dans mon fichier d'en-tête.

J'ai essayé une instruction IF / DEF afin de le faire fonctionner à la fois sur Windows et Linux: xxx

mais je ne peux pas penser à une méthode par laquelle je peux utiliser le si / DEF Structure pour vérifier l'existence de fichiers. Y a-t-il un moyen de le faire avec des directives de préprocesseur en C ++?


3 commentaires

Je n'utiliserais pas de chemin absolu. Utilisez plutôt un chemin relatif et définissez vos dossiers Inclure pour votre compilateur.


"Y a-t-il un moyen de le faire avec des directives de préprocesseur en C ++?" - non. Vous devez faire de tels contrôles à l'aide de votre système de construction - faire ou autre chose.


En règle générale, vous ne devez pas utiliser les chemins absolus dans les déclarations d'inclure. Votre compilateur, quoi que ce soit, accepte les indicateurs qui le disent là où il devrait rechercher des fichiers incluant, par exemple. G ++ -O Programme -I / USR / local / cuda / Inclure le programme.cpp .


4 Réponses :


-1
votes

La meilleure façon de le faire est de définir une macro qui permet de déterminer si le fichier est inclus ou non: xxx pré>

puis, les utilisateurs peuvent opter à la fonctionnalité conditionnelle en définissant ce drapeau : P>

gcc -DUSE_CUDA_NVML main.cpp


1 commentaires

Et vous ne devriez pas utiliser des chemins absolus du tout. Du tout. Demandez au système de construction et d'entourer les chemins le font. C'est une question d'environnement.



2
votes

Vous devriez juste faire

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


0 commentaires

3
votes

Mais je ne peux pas penser à une méthode permettant d'utiliser la structure IF / DEF pour vérifier l'existence de fichiers. Y a-t-il un moyen de le faire avec des directives de préprocesseur en C ++?

Depuis C ++ 17, il y a le macro __ has_include qui fait exactement cela.

Avant C ++ 17, il n'existait aucune directive de ce type dans la norme, bien que peut avoir été prise en charge comme une extension. Un compilateur peut prendre en charge l'argument de la ligne de commande pour fournir des définitions de macro, qui peuvent être utilisées pour transmettre le résultat d'une vérification de l'existence avant la compilation.


Cela dit, pour votre cas particulier, il pourrait être préférable d'inclure simplement et d'ajouter le répertoire parent pour inclure le chemin. Voir le manuel de votre compilateur pour plus de détails - ou utilisez un système de construction pour en prendre soin.


0 commentaires

0
votes

C ++ 17 simplifie celui-ci un peu avec __ has_include code> qui fournit la possibilité de #include code> un fichier uniquement si le fichier est trouvé dans le système.

#if __has_include( <optional> )
#   include <optional>
#elif __has_include( <experimental/optional> )
#   include <experimental/optional>
#else
//
#endif


0 commentaires