0

私が知る限り、コンパイル段階では翻訳単位は互いに何もありません。なぜ私がその奇妙な動作をするのか説明できますか: 1 つの A.cpp に windows.h を含めた後 (実際にはソケット 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'

私は以前にこの問題に直面し、Windowsヘッダーを含める前に #define WIN32_LEAN_AND_MEAN を実行すると修正されることを知っています。しかし、この場合、なぜそれが起こっているのですか?

4

1 に答える 1

0

Windows.h には winsock が含まれています。したがって、直接インクルードせず、使用しない場合でも、インクルードされます。#define WIN32_LEAN_AND_MEAN は、必要なヘッダーのみを強制的に含めるため、この問題を解決します。

可能性:

  • どういうわけか、winsock/winsock2 を 2 回インクルードしてしまいました: winsock の直接インクルードを削除して、windows.h のみをインクルードしてみてください。

  • Windows/Winsock を共通ヘッダー ファイルに追加しました: インクルード階層を確認してください。テストのために、一般的なヘッダーを削除し、ソース ファイルに直接インクルードしてみてください

  • プリコンパイル済みヘッダーが有効になっていますか? オフにしてみてください

これを参照してください: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/6177f9bc-db75-4317-9904-02ef55b527d0

于 2012-09-14T14:20:14.780 に答える