2007年6月8日 星期五

Visual C++ compile error C2011

因為用到ntohs, ntohl這些function, 所以有include到<winsock2.h>, compile時卻一直出現

'fdset' : 'struct' 型別重複定義
'hostent' : 'struct' 型別重複定義
......


很多類似這種重複定義的問題。有經驗的windows programmer應該會想到, 可能哪邊搞錯同時把<winsock.h>和<winsock2.h> include進來了, 可是search了一下project, 根本就沒有include到什麼<winsock.h>啊, 而且<winsock2.h>的開頭寫著:

#ifndef _WINSOCK2API_
#define _WINSOCK2API_
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */


有以上的#define, 應該就不會再去include到<winsock.h>裡面的東西了吧!? 應該是這樣沒錯, 除非......你寫成這樣:

#include <winsock.h>
#include <winsock2.h>


<winsock.h>可沒有什麼預防措施以避免include到<winsock2.h>, 所以這樣的排列就會造成<winsock2.h>裡面的定義全部跟<winsock.h>裡面的衝突。但是, 前面說過了, 我沒有include <winsock.h>啊!! 謎底揭曉了, VC的<windows.h>居然include <winsock.h>......, 而且如果include關係像以下這樣, 那一時之間也很難知道發生什麼問題......

myinc.h的內容

#include <windows.h>
...


main.cpp的內容

#include "myinc.h"
#include <winsock2.h>


main.cpp並沒有include <windows.h>, 是它的include file去include到的, 如果include file很多, 找起來會想撞牆......因此, 最好的方法還是以後都把<winsock2.h>擺最上面好了。

沒有留言: