因為用到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>擺最上面好了。
2007年6月8日 星期五
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言