編譯期報錯:
c:\program files (x86)\windows kits\10\include\10.0.17763.0\shared\ws2def.h(235): error C2011: “sockaddr”:“struct”類型重定義
解決思路:
先google搜"error C2011";
在微軟官方技術文檔裏找到其描述:
提到很可能是一個編譯單元#include了兩次.h頭文件導致,用#pragma once解決;
還可以把/P選項加到編譯器選項中(Visual Studio裏就是"屬性==>C/C++==>預處理器==>預處理到文件), 把#include後的文件輸出到.i文件裏而不執行編譯,然後Ctrl+F來查找該重複定義的struct第1次和第2次是在哪裏;
我的分析:
ws2def.h是系統自帶的文件,已經用#pragma once防得很好了,不可能是該文件兩次#include導致;則只能是其他.h文件裏也定義了同名strucht;
在一串報錯文本之前找到第一個最近的源碼文件,本例是"context.cc",則肯定是在編譯該文件時發現的錯;
在該文件的#include文件裏看,遞歸得看進去,即頭文件裏的頭文件也看;除去<iostream>等C++的頭文件,就是我自己加的<windows.h>和<Winsock2.h>;
自己建個VC++工程,#include這兩個文件,編譯報同樣錯誤!問題定位準確!
上google搜"C2011 windows.h Winsock2.h",發現stackoverflow上有解法,搞定!
問題原因:
windows.h裏和Winsock2.h裏都有“sockaddr”這個struct的定義;
解決方案:
1. 把二者先後順序調整一下;
2. 在#include <windows.h>之前加上#define WIN32_LEAN_AND_MEAN
3. 其他