Зачем включать direct.h или sys/stat.h условно на основе _WIN32 или __linux__?
Что будет делать следующий код? Почему это используется?
#ifdef _WIN32
#include <direct.h>
#elif defined __linux__
#include <sys/stat.h>
#endif
3 ответа
В C нет переносимого способа манипулирования каталогами файловой системы. Вам нужна библиотека, которая предоставляет интерфейсы для работы с каталогами. (Используя системный вызов, ОС прерывает подпрограммы и т. Д.)
direct.h
файл заголовка для языка программирования C для Windows Он содержит объявление функций и необходимых макросов, структур и т. Д., Используемых для управления каталогами файловой системы. В Linux как система, вы можете использовать sys/stat.h
для того же.
Теперь, если ваш код может быть скомпилирован для любой из ОС, вы можете оставить общий (переносимый) код без каких-либо средств защиты и сохранить код для Windows или Linux в блоке условной компиляции.
Если вы не включите эти файлы условно, вы можете получить direct.h not found
или аналогичная ошибка в Linux и любая аналогичная ошибка для Windows.
__linux__
предопределено компилятором, предназначенным для кода для Linux.
Этот документ MSDN говорит:
_WIN32: Определено для приложений для Win32 и Win64. Всегда определен.
Это условное утверждение, но для времени компиляции. Когда программа компилируется, она ищет платформу, на которой она работает, и включает соответствующий заголовок для вашей ОС (эти библиотеки реализованы для конкретной ОС):
direct.h
для оконsys/stat.h
для GNU/Linux
Это работает так же, как классический if/else
заявление:
if(platform == windows)
{
take_windows_lib();
}
else if (platform == linux)
{
take_linux_lib();
}
Он определяет, какую библиотеку включить
Поэтому, если вы запускаете код на платформе Win32, он использует библиотеку direct.h.
иначе, если обнаружит, что он работает на платформе Linux, использует библиотеку sys / stat.h
Доступность библиотеки отличается от платформы к платформе и может быть недоступна там. Я склонен игнорировать эти библиотеки, где это возможно. то есть. conio.h доступен только в старых средах ввода MS DOS и не будет работать в среде Linux/GNU