windows.h socket2 沖突
好像inlucde windows 會默認使用winsocket1 ,我們現在寫程序都是使用socket2 . 編譯會沖突.
1.種方法
#define WIN32_LEAN_AND_MEAN
放在windows.h 之前.
2. 先引入socket2.h文件.
3. 項目 -> 屬性 -> C/C++ -> 預處理器 -> 預處理器定義
放在windows.h 之前.
2. 先引入socket2.h文件.
3. 項目 -> 屬性 -> C/C++ -> 預處理器 -> 預處理器定義
在其中添加 : WIN32_LEAN_AND_MEAN
WIN32_LEAN_AND_MEAN: Windows 頭文件使用此符號來排除很少使用的頭文件。請參考 Windows.H,以確定當定義了此符號時,將排除的文件。由于 MFC 定義 WIN32_LEAN_AND_MEAN,所有 MFC 項目自動都使用它。
下面具體分析一下問題是怎么發生的。
參考
http://support.microsoft.com/kb/166474/zh-cn
http://tieba.baidu.com/p/705524374
錯誤情形1:我們在自己的工程中先包含winsock2.h再包含windows.h,如果WIN32_LEAN_AND_MEAN未定義且 _WIN32_WINNT大于或等于0x400,那么windows.h會在winsock2.h開頭被自動引入,而windows.h又會自動引入 mswsock.h,此時,mswsock.h里所用的socket類型還尚未定義,因此會出現類型未定義錯誤。
錯誤情形2:先包含 windows.h再包含winsock2.h,如果WIN32_LEAN_AND_MEAN未定義且_WIN32_WINNT未定義或者其版本號小于 0x400,那么windows.h會自動導入舊有的winsock.h,這樣再當winsock2.h被包含時便會引起重定義。
這里要說明的是,宏WIN32_LEAN_AND_MEAN的作用是減小win32頭文件尺寸以加快編譯速度,一般由AppWizard在stdafx.h中自動定義。_WIN32_WINNT的作用是開啟高版本操作系統下的特殊函數,比如要使用可等待定時器(WaitableTimer),就得要求 _WIN32_WINNT的值大于或等于0x400。因此,如果你沒有遇到上述兩個問題,很可能是你沒有在這些條件下進行網絡編程。
VC_EXTRALEAN 和WIN32_LEAN_AND_MEAN 用于排除Windows 標頭在很少 使用的服務