Зачем включать 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

Другие вопросы по тегам