VC++ 網絡程序 自帶頭文件錯誤

不知道大家有沒這種經歷,寫了一個網絡程序,一編譯,嚇,幾十上百個錯誤,真是恐怖啊,我就遇到過N次了。

恐怖的錯誤數量,加上全部是自帶頭文件的錯誤,錯誤位置也不好找,微軟的BUG真是害死人啊。

我最近發現了一個博客中寫道:

今天在幫她調試一個網絡程序時,發現了一個奇怪的問題:

就是假如包含頭文件的順序寫成:
#include <WINSOCK2.H>
#include <WINDOWS.h>
則程序沒有任何編譯錯誤!

但假如我把兩個頭文件的順序倒過來,寫成:
#include <WINDOWS.h>
#include <WINSOCK2.H>
編譯器就會報錯,說Server_ST.obj - 68 error(s), 11 warning(s),乍一看,好恐怖啊~哈哈

後來,我仔細看了一下編譯器報告的錯誤信息,發現大多數是重定義的錯誤,例如:
error C2011: 'fd_set' : 'struct' type redefinition
error C2011: 'sockaddr_in' : 'struct' type redefinition
。。。。
從經驗來看,這些錯誤應該是由於頭文件被多次包含引起的,可到底是怎麼回事??
假如真的是由於頭文件被多次包含而導致錯誤,我們知道,上面這些結構體都是在winsock2.h中定義的,那麼由此可以確定是頭文件winsock2.h被重複包含了,可令人不可以理解的是我明明只包含了一次啊!!呵呵,可再回頭一看,啥都不用說了,肯定是windows.h惹得禍,因爲除了它再不會有別人了……

後來我在網上查閱到了一段介紹這個內幕的話:
This problem arises because windows.h (at least, that version of it) includes notwinsock2.h but winsock.h; sadly when Microsoft wrote winsock2.h they chose neither to changewindows.h to include winsock2.h, which replaces winsock.h, nor to includewindows.h from winsock2.h
噢,原來是微軟的疏忽給我們帶來了這個小小的不便~ 呵呵,也許你會懷疑,微軟也會犯這種錯誤?他肯定會處理好頭文件,避免重複包含的呀!!
讓我們打開winsock2.h看個究竟,在文件一開始我們就會看到:
#ifndef _WINSOCK2API_
#define _WINSOCK2API_
#define _WINSOCKAPI_       /* Prevent inclusion of winsock.h in windows.h */
.......
#endif
我想在windows.h中應該存在類似於下面這樣的代碼:
#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <winsock.h>
#endif
到這裏,錯誤的原因也就真相大白了……    
弄清楚了錯誤的根源,我們也就很容易可以找到解決辦法了,這裏給出兩種:
<1>
#define _WINSOCKAPI_
#include <WINDOWS.h>
#include <WINSOCK2.H>
<2>
#include <WINSOCK2.H>
#include <WINDOWS.h>


關於頭文件這塊,我有兩點自己的認識:
A.   “聲明”可以被重複包含多次,但“定義”在一個.c/.cpp文件中只允許被包含一次。
B.    VC中是以.c/.cpp文件爲單位來進行編譯的,所以在整個項目中,一個頭文件可能會被包含多次。這也是爲什麼我用#pragma message指令測試#ifdef能否防止被多次包含時,發現編譯一個項目時仍然會輸出多個message的原因,因爲假如多個c/cpp文件包含同一個頭文件,則該頭文件就會多次被編譯器編譯解析,從而輸出多個message。也就是說:#ifdef的作用範圍是一個.c/cpp文件,而不是整個項目。我們可以把編譯器編譯一個.c/cpp文件的過程稱爲一個編譯session,而一個#ifdef的有效範圍只是在它所屬的編譯session.


由這我再次意識到了在頭文件中使用#ifdef預編譯指令的重要性!!!

 

帖子原鏈接:http://blog.csdn.net/rainkop/article/details/8185695

很強大,所有的錯誤都可以歸納到此,只不過說的貌似有點多餘,比如windows.h中已經包含了winsock2.h就不必要再包含winsock2.h了。

但是如果使用了WinPcap函數呢?錯誤又是一堆。

照着這個帖子的辦法,先#include <pcap.h>,再#include <windows.h>,錯誤就解決了。

感謝寫這篇帖子的人,給了我很大的幫助。這個錯誤確實出現的不多,一旦出現就會手忙腳亂。

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