0

As far as I know translation units no nothing about each other on the compilation phase. Can you explain why do I have then that strange behavior: after include windows.h in one A.cpp (which actually doesn't use socket api and doesn't include winsock2.h) I get error while compiling ANOTHER B.cpp with winsock2.h winsock.h conflict. This B.cpp hasn't been changed at all. Thanks in advance.

EDIT: It's actually a COMPILATION not link error. I've put msvc compiler in a verbose mode here header include tree:

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'

I faced this problem before and know that #define WIN32_LEAN_AND_MEAN before including windows header fixes it. But why is it happening in this case?

Alexander Reshytko
  • 2,126
  • 1
  • 20
  • 28
  • Either one of the `.cpp` files includes the other, you've described the situation inaccurately (for example, you actually get the error during linking, not compiling), or something extremely weird is going on. More details would help a lot, for example, the exact error message. – David Schwartz Sep 14 '12 at 13:34
  • 1
    What is the error? If you are indeed compiling A and B separately, yes, there is no reason they should conflict with one another. I believe what you are actually doing is compiling them and then linking them and you're ending up with a linker error, but because you didn't mention the actual error, it's only a theory that cannot be tested. – Omaha Sep 14 '12 at 13:34
  • No guys it's a compilation error I've added details in the original question – Alexander Reshytko Sep 14 '12 at 13:48

1 Answers1

0

Windows.h includes winsock. So even if you do not include directly and do not use it, it will get included. #define WIN32_LEAN_AND_MEAN resolves this problem because this forces inclusion of only necessary headers.

Possibilities:

  • You have somehow ended up including winsock/winsock2 twice: Try removing winsock direct include and include only windows.h

  • You have added windows/winsock to a common header file: Check the include hierarchy. For testing remove common headers and try to include them directly in the source files

  • Do you have pre-compiled headers turned on? Try turning it off

See this for reference: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/6177f9bc-db75-4317-9904-02ef55b527d0

gammay
  • 5,957
  • 7
  • 32
  • 51
  • Another option - make sure `winsock2.h` is included before `windows.h`, as `winsock2.h` disables `winsock.h` from being compiled, but the reverse is not true. – Remy Lebeau Sep 15 '12 at 00:55