SocketのプログラムをWindowsで書く場合、winsock.hまたはwinsock2.hをインクルードすることになる。
前者はVersion1のWinSockで、後者はVersion2となっていて、TCP、UDP以外のプロトコルを使いたい場合や、高速な通信を行いたい場合は多機能な新バージョンの WinSock Ver2 を用いるわけだが、ここには罠が存在している。
winsock.h と winsock2.h は互いに排他的で、同時に使用することはできない。(関数や構造体が同名異義となっているものがある)そこでwinsock2.hだけをインクルードしようとするわけだが、実はwindows.h内部でwinsock.hがインクルードされているのだ。
これを回避するためには、windows.hをインクルードする前に _WINSOCKAPI_ を define する。
こうするとwinsock.hがインクルードされても、中身をパスしてくれるのでwinsock2.hをインクルードしても定義の重複は発生しない。
ライブラリなどを組んでいるとあちこちのソースファイルで windows.h をインクルードしているので、結構面倒くさいものである。よって#defineでコード中に記述するより、プロジェクトオプションで定義したほうがよいだろう。しかし、DirectXのライブラリ(d3d9.hとか)でも普通にwindows.hインクルードしてあるので、この場合、手が出せない。この場合ワーニングが出まくるのを我慢するか #pragma warning ( disable : 4005 ) としてワーニングを消してしまう他方法はないものと思われる。
後から追加されたライブラリであることから、しかたないともいえるかもしれんがこの実装はどうかと思うな。
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |