Как использовать сущности #ifdef как часть функций в заголовочных файлах - PullRequest
0 голосов
/ 20 марта 2012

Я хотел бы спросить, можно ли использовать объекты, определенные в блоке #ifdef, в заголовочных файлах. Чтобы было понятно, у меня есть следующий код:

#ifdef WIN32
    #include <winsock2.h>

    #define SOCKET_HANDLE     SOCKET
    #define CONNECTION_HANDLE SOCKET
#endif


SOCKET_HANDLE createServerSocket(const char* hostAddress, short port);

Я Java-разработчик, и мне это кажется вполне подходящим. Однако у компилятора есть проблема с этим.

Можете ли вы объяснить, почему этот код является проблемой? Также, как я могу заставить его скомпилировать. (Идея состоит в том, чтобы иметь общий интерфейс и условную компиляцию для определения реальных типов в соответствии с запущенной платформой во время компиляции.)

Спасибо

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Отсутствует токен после #ifdef.В этом случае похоже, что вы хотите собрать для Windows:

#ifdef WIN32

Возможно, вам понадобится ветка #else при компиляции на других платформах.Например:

#ifdef WIN32
    #include <winsock2.h>

    #define SOCKET_HANDLE     SOCKET
    #define CONNECTION_HANDLE SOCKET
#else
    #define SOCKET_HANDLE     int
    #define CONNECTION_HANDLE int
#endif
1 голос
/ 20 марта 2012

#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. См. это обсуждение для получения более подробной информации.

Редактировать

Заметив ваши изменения в вопросе и точное сообщение об ошибке, которое вы разместили в комментарии, проблема состоит из трех частей:

  1. WIN32 - неправильный макрос. Это должно быть _WIN32 или _WIN64. Смотри выше.
  2. Из-за 1 компилятор никогда не видит #define s и #include, и поэтому SOCKET_HANDLE и CONNECTION_HANDLE оба не определены.
  3. Из-за 2, когда компилятор видит SOCKET_HANDLE createServerSocket(const char* hostAddress, short port);, он не распознает SOCKET_HANDLE и завершает работу с ошибкой

Решение состоит в том, чтобы исправить проверяемый макрос, изменив его с WIN32 на _WIN32 или _WIN64. Кроме того, вы должны указать ветку #else на случай, если обнаружение операционной системы полностью завершится неудачей, например, предположим, , что вы компилируете $mostlikelyos и #define и #include соответственно.

1 голос
/ 20 марта 2012
#ifdef SOMETHING

В вашем коде отсутствует ЧТО-ТО

Подробнее о директивах предварительной обработки читайте здесь

http://msdn.microsoft.com/en-us/library/3sxhs2ty(v=vs.80).aspx

РЕДАКТИРОВАТЬ : послеотредактируйте вопрос, я попробовал это в Dev Cpp.Он отлично работает, так как WIN32 определен для меня.Даже _WIN32 определено в моей IDE.Оба хорошо работают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...