Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Подключаю <windows.h> и <winsock2.h>=ошибка


Автор: Dmi3ev 25.2.2009, 03:33
продолжаю в VS разбираться.
только подключаю <windows.h>, сразу проблемы (консоль).
Цитата(output)

1>------ Build started: Project: Socket1, Configuration: Debug Win32 ------
1>Compiling...
1>Socket1.cpp
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : see previous definition of 'AF_IPX'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(127) : warning C4005: 'AF_MAX' : macro redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : see previous definition of 'AF_MAX'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : see previous definition of 'SO_DONTLINGER'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : see declaration of 'sockaddr'
//...
1>Socket1 - 105 error(s), 16 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

как это исправить?

Автор: andrew_121 25.2.2009, 05:50
Dmi3ev, Какая версия студии?
Покажи порядок подключения хедеров.

Автор: mrbrooks 25.2.2009, 08:47
Dmi3ev, а ты где именно его инклюдишь? В stdafx.h?

Автор: cutwater 25.2.2009, 11:04
перед инклюдами нужно тогда сделать такой хитрый дефайн

#define WIN32_LEAN_AND_MEAN

Автор: Dmi3ev 25.2.2009, 11:49
cutwater, действительно, проблема решилась, а можно пояснения???

Автор: cutwater 25.2.2009, 12:36
В двух словах - исключает редко используемые описания и т.д. из заголовков windows
А если подробней, то в MSDN. 

Цитата

Faster Builds with Smaller Header Files

You can reduce the size of the Windows header files by excluding some of the less common API declarations as follows:

    * Define WIN32_LEAN_AND_MEAN to exclude APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets.
    * Define one or more of the NOapi symbols to exclude the API. For example, NOCOMM excludes the serial communication API. For a list of support NOapi symbols, see Windows.h.


Автор: pan2004 25.2.2009, 17:30
Ну, от отсутствия дефайна такой проблемы быть в принципе не должно.
Цитата

 error C2011: 'sockaddr' : 'struct' type redefinition

Одна и та же структура объявляется в двух разных хидерах. Видимо, у MS не все в порядке с головой было.

Автор: Dmi3ev 25.2.2009, 18:25
pan2004, не понял, за что ты мне репутацию уменьшил, но да ладно дело не в этом.
Я разбираюсь в студии и не понимаю, почему
Код

#include "stdafx.h"
//#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <winsock2.h>
#include <iostream>

using namespace std;

int _tmain()
{
    system("pause");


    return 0;
}

вот это выдает 105 ошибок и 16 предупреждений
вот они...
Цитата

1>------ Build started: Project: Socket1, Configuration: Debug Win32 ------
1>Compiling...
1>Socket1.cpp
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : see previous definition of 'AF_IPX'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(127) : warning C4005: 'AF_MAX' : macro redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : see previous definition of 'AF_MAX'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : see previous definition of 'SO_DONTLINGER'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : see declaration of 'sockaddr'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing '}' before 'constant'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing ';' before 'constant'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2059: syntax error : 'constant'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C2143: syntax error : missing ';' before '}'
1>c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

...
1>d:\programms\vs\vc\include\xutility(1283) : fatal error C1003: error count exceeds 100; stopping compilation
1>Build log was saved at "file://c:\Users\Павел\Documents\Visual Studio 2008\Projects\Socket1\Socket1\Debug\BuildLog.htm"
1>Socket1 - 105 error(s), 16 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



а вот это пашет
Код

#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <winsock2.h>
#include <iostream>

using namespace std;

int _tmain()
{
    system("pause");


    return 0;
}

лучше объясните, а не репутацию мне уменьшайте, мне на это по... а вот почему так происходит, меня волнует...



 ! 
bsa
Пожалуйста, в следующий раз не размещай такое количество бесполезной информации
Кнопку "Код" используй для кода, а не для вывода ошибок. В крайнем случае используй его вариант "Без подсветки"

Автор: Dem_max 25.2.2009, 18:38
pan2004, 
Цитата

Ну, от отсутствия дефайна такой проблемы быть в принципе не должно.

У Builder тоже самое.
решается так
Код

#include <winsock2.h>
#include <windowsx.h>  




Автор: mrbrooks 26.2.2009, 16:25
пробуй так:
Код

#pragma comment (lib, "ws2_32.lib")
#include <winsock2.h>
#include <windows.h>
#include <iostream>


совет - выше написанное - вставь в stdafx.h

Добавлено через 1 минуту и 40 секунд
собственно библиотеку ws2_32.lib можешь присоединить и в свойствах проекта. Иначе работа с сокетами нормальной не будет.

Добавлено через 3 минуты и 13 секунд
будь внимателен сначало winsock2.h, затем windows.h  smile 

Автор: mrbrooks 26.2.2009, 16:52
Можно и так:
Код

#pragma comment (lib, "ws2_32.lib")
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>


Цитата(Dmi3ev @  25.2.2009,  18:25 Найти цитируемый пост)
вот почему так происходит, меня волнует..

Дело в том, что в windows.h инклудится winsock.h, который во многом повторяет winsock2.h.

Добавлено через 3 минуты и 42 секунды
Код

#define _WINSOCKAPI_

это собственно и отменяет включение winsock.h, как и WIN32_LEAN_AND_MEAN - только более конкретно.

Автор: Dmi3ev 26.2.2009, 17:44
mrbrooks, спасибо за объяснения. Я пишу теперь вот так:
Код

#include <winsock2.h>
#include <windows.h>

в такой последоватльности все почему-то работает, а в такой нет:
Код

#include <windows.h>
#include <winsock2.h>

ладно, понял суть проблемы, знаю пути ее решения (причем несколько), уже неплохо, в дебри лезть не нужно, наверно...
там просто ошибки, не хватает точки с запятой... левые какие-то...

Автор: Олег2005 26.2.2009, 23:23
если есть
#include <winsock2.h>
то это вообще не надо
#include <windows.h>

Автор: GremlinProg 26.2.2009, 23:43
вобщем-то так оно и есть: winsock2.h сам подключает windows.h, если он не был подключен
Код

#ifndef _INC_WINDOWS
#include <windows.h>
#endif /* _INC_WINDOWS */

причем перекрывает перед этим включение winsock.h, чтобы не было конфликтов
Код

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */


Добавлено через 13 минут и 53 секунды
 smile на счет замечания Dmi3ev - справедливо в любом случае, поскольку первая ошибка - корень проблем, остальные - следствия предыдущих, зачем грузить моск форумчанам ненужной информацией,
для гармонии достаточно было пару-тройку строк оставить и все


Автор: ZakharAV 13.10.2009, 07:50
Добрый день, люди. Начал осваивать VC. Установил VC2005 Express Edition. При компиляции программки выдает сообщение - нет windows.h. В установленном комплекте его нет.  Вопрос - в Express Edition его по определению не может быть или я что-то не то и не туда вставил?  smile

Добавлено через 3 минуты и 52 секунды
Прошу прощения - ошибся темой. Пощел к новичкам

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)