Clang и GCC очень долго использовали макрос __has_include
, который можно использовать так:
#if __has_include("my_library.h")
#include "my_library.h"
#endif
Работает и с угловыми скобками (фактически, он работает со всем, что вы можете передать #include
):
#if __has_include(<my_library.h>)
#include <my_library.h>
#endif
__has_include
недавно был помазан стандарт C ++ 17 , что означает, что компиляторы C ++, которые не 'Теперь его поддержка, скорее всего, будет не слишком отдаленной.Поскольку это функция препроцессора, компиляторы C, принадлежащие к тому же набору, что и компилятор C ++, также имеют высокий шанс получить эту функцию с помощью осмоса.
Тем не менее, обратите внимание, что хотя __has_include
сообщит вам, еслиЗаголовочный файл присутствует, он не спасет вас от возможных ошибок компоновщика в случае сбоя установки.
Старый способ сделать это - подготовить сценарий предварительной сборки, который пытается скомпилировать #include "my_library.h"
и выведите файл конфигурации с #define HAS_LIBRARY_SOMETHING
на 0 или 1 в зависимости от результата этой операции.Такой подход используют такие программы, как autoconf.