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: 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. P> J'ai essayé une instruction IF / DEF afin de le faire fonctionner à la fois sur Windows et Linux: p> 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 ++? P> p>
4 Réponses :
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: puis, les utilisateurs peuvent opter à la fonctionnalité conditionnelle en définissant ce drapeau : P> gcc -DUSE_CUDA_NVML main.cpp
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.
Vous devriez juste faire
g++ -I/usr/local/cuda/include ...
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 ++? P> blockQuote>
Depuis C ++ 17, il y a le macro
__ has_include code> qui fait exactement cela. P>
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. P>
Cela dit, pour votre cas particulier, il pourrait être préférable d'inclure simplement
code> 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. P>
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
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 code>.