error C2011 type redefinition類型重定義

編譯期報錯:

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. 其他

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章