Est-il possible d’inclure une bibliothèque uniquement si elle est disponible pour le compilateur?
J’ai pensé à le vérifier avec #ifndef
(comme indiqué ci-dessous), mais il vérifie simplement si un nom de macro n’est pas défini et ce dont j’ai vraiment besoin, c’est de vérifier si le compilateur peut accéder à une bibliothèque C au moment de la compilation.
#ifndef _MY_LIBRARY_H #include "my_library.h" #endif
Y at-il un moyen de faire cette vérification?
Clang et GCC ont une macro __has_include
depuis très longtemps, que vous pouvez utiliser comme ceci:
#if __has_include("my_library.h") #include "my_library.h" #endif
Cela fonctionne aussi avec les chevrons (en fait, ça marche avec tout ce que vous pouvez passer à #include
):
#if __has_include() #include #endif
__has_include
a récemment été oint en C ++ 17 standard , ce qui signifie que les compilateurs C ++ qui ne le prennent pas en charge l’auront probablement dans une fonctionnalité pas trop éloignée. Comme il s’agit d’une fonctionnalité de préprocesseur, les compilateurs C appartenant à la même suite qu’un compilateur C ++ ont également de grandes chances d’obtenir cette fonctionnalité par osmose.
__has_include
, notez que, bien que __has_include
vous indique si le fichier d’en-tête est présent, il ne vous évitera pas d’éventuelles erreurs d’éditeur de liens en cas d’installation défectueuse.
La méthode #define HAS_LIBRARY_SOMETHING
à créer un script de pré-génération essayant de comstackr #include "my_library.h"
et de générer un fichier de configuration avec #define HAS_LIBRARY_SOMETHING
à 0 ou 1, en fonction du résultat de cette opération. C’est l’approche que déploient des programmes comme autoconf.