C ++: Компиляция независимости единиц перевода и ошибка переопределения старых типов winsock2.h

Насколько мне известно, единицы перевода ничего не говорят друг о друге на этапе компиляции. Можете ли вы объяснить, почему у меня такое странное поведение: после включения windows.h в один A.cpp (который на самом деле не использует сокет api и не включает winsock2.h) я получаю ошибку при компиляции ДРУГОГО B.cpp с winsock2.h конфликт winsock.h. Этот B.cpp вообще не был изменен. Заранее спасибо.

РЕДАКТИРОВАТЬ: на самом деле это ошибка КОМПИЛЯЦИИ, а не ссылка. Я поставил компилятор msvc в подробный режим, здесь заголовок включает дерево:

2>perfomancemeter.cpp
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\numeric
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\iterator
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\climits
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\yvals.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\sal.h
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtassem.h
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vadefs.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\use_ansi.h
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\limits.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\utility
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\iosfwd
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstdio
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stdio.h
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\swprintf.inl
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstring
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\string.h
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cwchar
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\wchar.h
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\wtime.inl
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xstddef
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstddef
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stddef.h
2>Note: including file:         C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdbg.h
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\algorithm
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\memory
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xmemory
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\cstdlib
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stdlib.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\exception
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\eh.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\malloc.h
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\new
2>Note: including file: d:\repos\cbs\billing\common\perfomancemeter.h
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\vector
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\stdexcept
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xstring
2>Note: including file: d:\repos\cbs\billing\common\util.h
2>Note: including file:  d:\repos\cbs\billing\common\framework\include\types/types.h
2>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\string
2>Note: including file:   C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\istream
2>Note: including file:    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\ostream
2>Note: including file:     C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\ios
2>Note: including file:      C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocnum
2>Note: including file:       C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\streambuf
2>Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xiosbase
2>Note: including file:         C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocale
2>Note: including file:          C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\typeinfo
2>Note: including file:          C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xdebug
2>Note: including file:          C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocinfo
2>Note: including file:           C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xlocinfo.h
2>Note: including file:            C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\ctype.h
2>Note: including file:             C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
2>Note: including file:            C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\locale.h
2>Note: including file:             C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\crtdefs.h
1>c:\program files (x86)\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: 'fd_set' : 'struct' type redefinition
1>        c:\program files (x86)\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : see declaration of 'fd_set'

Я сталкивался с этой проблемой раньше и знаю, что #define WIN32_LEAN_AND_MEAN перед включением заголовка Windows исправляет ее. Но почему это происходит в данном случае?


person Alexander Reshytko    schedule 14.09.2012    source источник
comment
Либо один из .cpp файлов включает другой, вы неверно описали ситуацию (например, вы действительно получаете ошибку во время компоновки, а не компиляции), либо происходит что-то очень странное. Более подробная информация может очень помочь, например, точное сообщение об ошибке.   -  person David Schwartz    schedule 14.09.2012
comment
В чем ошибка? Если вы действительно компилируете A и B по отдельности, да, нет причин, по которым они должны конфликтовать друг с другом. Я считаю, что на самом деле вы их компилируете, а затем связываете, и в итоге вы получаете ошибку компоновщика, но поскольку вы не упомянули фактическую ошибку, это всего лишь теория, которую нельзя проверить.   -  person Omaha    schedule 14.09.2012
comment
Нет, ребята, это ошибка компиляции, я добавил подробности в исходный вопрос   -  person Alexander Reshytko    schedule 14.09.2012


Ответы (1)


Windows.h включает winsock. Так что, даже если вы не включите его напрямую и не используете, он будет включен. #define WIN32_LEAN_AND_MEAN решает эту проблему, потому что это приводит к включению только необходимых заголовков.

Возможности:

  • Каким-то образом вы дважды включили winsock / winsock2: попробуйте удалить прямое включение winsock и включить только windows.h

  • Вы добавили windows / winsock в общий файл заголовка: проверьте иерархию включения. Для тестирования удалите общие заголовки и попробуйте включить их прямо в исходные файлы.

  • У вас включены предварительно скомпилированные заголовки? Попробуйте выключить это

См. Для справки: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/6177f9bc-db75-4317-9904-02ef55b527d0

person gammay    schedule 14.09.2012
comment
Другой вариант - убедитесь, что winsock2.h включен перед windows.h, поскольку winsock2.h отключает компиляцию winsock.h, но обратное неверно. - person Remy Lebeau; 15.09.2012