#ifdef
- условный оператор препроцессора. Подобно if
заявлениям, им нужно что-то оценить, чтобы можно было взять ту или иную ветвь.
В случае #ifdef
он оценивает, определен ли данный макрос. например,
#ifdef BLAH
/* true branch */
#else
/* false branch */
#endif
Проверяет, определен ли макрос BLAH. На основании результата код в ветви true или false включается и компилируется, остальные отбрасываются.
В вашем конкретном случае использование #ifdef
вполне очевидно для обеспечения того, что используются заголовки и типы сокетов, соответствующие операционной системе, компилирующей код (без учета кросс-компиляции на данный момент).
Для кода в вашем вопросе вы хотите проверить макрос _WIN32
и / или _WIN64
. Они неявно определяются большинством компиляторов, ориентированных на операционную систему Windows. Обратите внимание, что в VC ++ _WIN32
определяется для 32-битной и 64-битной Windows, а _WIN64
определяется только для 64-битной Windows. См. это обсуждение для получения более подробной информации.
Редактировать
Заметив ваши изменения в вопросе и точное сообщение об ошибке, которое вы разместили в комментарии, проблема состоит из трех частей:
WIN32
- неправильный макрос. Это должно быть _WIN32
или _WIN64
. Смотри выше.
- Из-за 1 компилятор никогда не видит
#define
s и #include
, и поэтому SOCKET_HANDLE
и CONNECTION_HANDLE
оба не определены.
- Из-за 2, когда компилятор видит
SOCKET_HANDLE createServerSocket(const char* hostAddress, short port);
, он не распознает SOCKET_HANDLE
и завершает работу с ошибкой
Решение состоит в том, чтобы исправить проверяемый макрос, изменив его с WIN32
на _WIN32
или _WIN64
. Кроме того, вы должны указать ветку #else
на случай, если обнаружение операционной системы полностью завершится неудачей, например, предположим, , что вы компилируете $mostlikelyos
и #define
и #include
соответственно.