C, особенности компиляторов Windows

Рейтинг: 1Ответов: 1Опубликовано: 03.05.2015

Продолжаю перетаскивать код под Windows. С MinGW никаких проблем не возникло, но вот со студией:

  1. open()/read() там находятся в io.h. Которого, в свою очередь, нет в mingw :)
  2. Сокеты закрываются closesocket(), а не close()
  3. strncasecmp() нет
  4. PATH_MAX нет (но есть MAX_PATH)

И т.д.

Всё это вполне безболезненно обходится проверкой _MSC_VER.

Есть ещё одна контора, которая Open Watcom юзает. Но тут просто, mingw-код он лопает без изменений.

Какие ещё компиляторы могут встретиться в мире Windows из распространённых, и какие у них могут быть тараканы по сравнению с GNU? Речь пока именно о стандартных библиотеках/макросах.

Ответы

▲ 3

То что Вы перечислили - это не стандартные библиотеки Си, а библиотеки конкретных платформ, и ничего удивительного что они отличаются.

По этому компилятор тут вообще ни при чем, всё дело в библиотеках которые установлены в системе. В комплекте с MinGW обычно идет куча библиотек, обеспечивающих какую-то совместимость с POSIX, а в Visual C++ их естественно нет, так что их надо устанавливать самостоятельно.


Насчет #if defined OS_WIN - редко когда пишут

#if defined OS_WIN
    windows_function(0, y, x, 0);
#else
    posix_function(x, 123, y);
#endif

Обычно в обычном коде используют кроссплатформенные обертки типа function(x, y), а весь платформозависимый код выносится в отдельный файл.

Также есть практика размещать код для разных платформ в разных файлах, например function_win.c, function_posix.c с общим заголовочным файлом function.h. Тогда #if defined не используется вообще, и выбор конкретной реализации переносится в скрипты системы сборки.