windows.hとwinsock.hとwinsock2.hと
winsock.hとwinsock2.hは競合する
windows.hにはwinsock.hが含まれている
windows.hとwinsock2.hをどちらも使いたいときにどうしようもなくなる
windows.hをインクルードする前に下記を定義するとwinsock.hのインクルードを回避してくれる。
#define WIN32_LEAN_AND_MEAN
分割コンパイルの時には複数回ヘッダが読まれることがあるので#define WIN32_LEAN_AND_MEANを記載する位置に注意する。
なるべく上位で定義しないとうまく回避してくれない場合がある。
もしくはインクルードの順番をwinsock2.h -> winsock.hにするとよい。
#define _WINSOCKAPI_
この対処はよくないと思う。
本当はインクルードしてないwinsock.hをインクルードしたからもうしなくていいよっていうウソの定義をしている。
どっかでエラーが出るかもっていうか実際にboost::asioでエラーが出た。
boost::asioには_WINSOCKAPI_が定義されているとエラーを出すところがある。