Comment puis-je vérifier si une bibliothèque est disponible avant de comstackr un programme C

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.