Как я могу проверить, доступна ли библиотека перед компиляцией программы на C?
Есть ли способ включить библиотеку, только если она доступна для компилятора?
Я думал о том, чтобы проверить это с #ifndef
(как показано ниже), но он просто проверяет, не определено ли имя макроса, и что мне действительно нужно, это проверить, может ли компилятор обращаться к библиотеке C во время компиляции.
#ifndef _MY_LIBRARY_H
#include "my_library.h"
#endif
Есть ли способ сделать эту проверку?
1 ответ
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.