проверка наличия библиотеки через препроцессор - PullRequest
0 голосов
/ 06 июля 2018

Существует две библиотеки zconf.h и unistd.h, которые используются, по крайней мере, для получения pid процесса. Обычно я тестирую свой код на Mac OSX и Ubuntu 18.04, в которых они предпочтительно используют zconf.h (компилятор предлагает zconf.h вместо unistd.h), если я забуду добавить, то, если код работает, это нормально. Однако в какой-то предыдущий день мне нужно было протестировать код на другом компьютере AFAIR, на котором установлена ​​Ubuntu 10 или 12. Его компилятор жаловался на отсутствие zconf.h. Интересно, есть ли способ проверить, есть ли у машины zconf.h, если нет, используйте unistd.h. Можно ли это сделать с помощью препроцессоров, таких как,

#ifdef ITS_IF_CONDITION
    #include <zconf.h>
#else
    #include <unistd.h>

1 Ответ

0 голосов
/ 06 июля 2018

Более новые версии компиляторов GCC, clang и MSVC реализуют функцию __ has_include .Хотя это функция C ++ 17, я считаю, что все три поддерживают ее и на простом языке C.

Но традиционный (и, вероятно, более переносимый) способ - проверить наличие включаемых файлов в скрипте конфигурации перед процессом сборки,И autoconf , и cmake имеют способы для достижения этой цели.

#ifdef __has_include
    #if __has_include(<zconf.h>)
        #include <zconf.h>
    #else
        #include <unistd.h>
    #endif
#else
    #include <unistd.h>
#endif
...