1)disable
#pragma warning (disable: 4311 4312) //指標類型強制轉化,大小不完全符合
warning C4311: 'type cast' : pointer truncation from 'TriNode *const ' to 'long'
warning C4312: 'type cast' : conversion from 'unsigned int' to 'SAC_Node_Add *' of greater size
注: 64位編程時,c4311的警告要處理,c412可以不處理.
#pragma warning (disable: 4244 4267) //遺失資料,4244為已知類型,4267為64位類型轉化
warning C4244: '=' : conversion from 'long' to 'char', possible loss of data
warning C4267: '=' : conversion from 'size_t' to 'long', possible loss of data
#pragma warning (disable: 4996) //安全警告
warning C4996: 'fopen' was declared deprecated
2)MSVCR80D.dll
fat32的檔案系統的時間戳記有問題,ntfs分區下就沒這個問題.
解決方案是:在編輯狀態下,點項目菜單 -> property -> 配置屬性 -> 清單工具,將右面的“使用FAT32解決辦法”選為“是”即可。
3)調試參數選項
a)行號設定: Tools->Options->Text Editor->C/C++, display: line numbers勾選上
b)調試變數中使用10進位數字: 在調試器視窗中右擊,16進位顯示勾去掉.
c)工作路徑: 右擊工程屬性頁面property page,General-->output directory;
d)可執行程式: 右擊工程屬性頁面property page, debugging-->command;
e)設定先行編譯標頭檔: 現象:fatal error C1010: unexpected end of file while looking for precompiled header directive,
解決方案: 右擊項目工程中的該cpp檔案,property page, c/c++-->precompiled headers,選擇第一項,不使用先行編譯標頭檔;
4)調試DLL
不能進入到DLL的source code中,解決方案如下:
一是clean-->rebuild; 二是設定項目依賴關係; 如果不行的話,就有可能是某個檔案的注釋或者其它莫名其妙的原因導致出錯,就對要進入的那個檔案重新分析,最好恢複到上次能進入的頁面看是什麼導致出錯.
5)64位元輸出
_int64 num1;
printf("%I64d", num1);
在gcc可用%ll直接得到64位輸出. typedef long long _int64;
NOTE:VC下不支援long long資料類型,只能使用MS的_int64,下面分別是vc下64的無符號,有符號,16進位輸出格式
#define HOST_WIDEST_INT_PRINT_DEC "%I64d"
#define HOST_WIDEST_INT_PRINT_UNSIGNED "%I64u"
#define HOST_WIDEST_INT_PRINT_HEX "0x%I64x"
6)winsock2.h與windows.h重定義的問題
a)方案1: 在windows.h前加 宏定義WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN //此宏用來加快載入windows.h,可以少包含一些較少使用的標頭檔
#include <windows.h>
b)方案2: 在 windows.h 前先 winsock2.h
7)怎麼使用MFC庫? (輕量級的使用).
假設: 在一個windows console程式中,後來要使用MFC的字串模板類CString,但不需增加太多的MFC其它類.
方法:
a)先在VC項目菜單-> property -> general -> use of MFC中,選用: use MFC in a Share Dll;
b)產生一個stdafx.h,在這個標頭檔中,只包括
#include <afxwin.h> // MFC core and standard components
如果使用了socket函數,則
#include <afxsock.h> //instead of <winsock2.h> <mswsock.h>
//其它需要添加的結構或標頭檔...
8)error
a)要注意變數的生存周期,在for,while語句裡的變數如果下面還要使用,那麼此變數要提前到語句之前申明;
b)
xx)檔案IO要注意的問題
a)檔案控制代碼: 數位檔案描述符,一個進程能開啟的所有檔案控制代碼總數是有限制的,經測試<1024(系統限制數),此外,進程關閉,所有此進程開啟的檔案控制代碼自動關閉;檔案控制代碼是可重用的,每次得到的檔案控制代碼一定是最小的未用的;所以同一線程不斷開啟關閉,可能獲得控制代碼指標是一樣的,而且線程ID也可能一樣;
b)IO的效率: 最好BUFFSIZE的大小與檔案塊長相同,如常見的8k一塊的檔案系統,效率最高;
c)檔案分享權限設定:核心維護三種資料結構:進程表項,檔案表項,檔案節點結構;此三張表構成了檔案與進程之間的關係.也是理解檔案讀寫加鎖的關鍵; 注意每個進程都在進程表項中佔有一個位置,每個進程都指向一個進程相關的開啟檔案表項,而每個檔案維護一個檔案節點結構.所以,各進程獨享的變數是檔案描述符,開啟檔案的檔案狀態標誌,當前檔案位移位置;而每個檔案的檔案長度,所有者,裝置,磁碟中的位置指標等是各進程共用變數.
d)檔案路徑:用./來表示下層目錄,也可用.//來表示,/是轉義符,表示'/'要用'//'.
e)鎖的技巧:檔案級,位元組級;
f)函數的提示:
不帶緩衝的IO是指系統調用函數:read,write,lseek,open,close...
lseek.fseek僅將當前檔案位移量記錄在核心,允許檔案位移量大於檔案大小,不引起IO操作,因此本函數通常不會出錯,lseek是為下一步讀寫函數服務的.要對檔案讀寫函數進行判斷,fread,fwrite,若出錯,就要關閉檔案指標.每次讀寫操作後,位移量要進行變動,才能進行下一步操作,否則操作的是一次同一個位置,除非開啟檔案使用append方式.(換句言,每次讀定操作寫,先要定位位移量).
多進程讀同一個檔案能正常工作,因為每個進程各有自己的檔案表項,當中有自己的檔案位移量;但多進程同寫一個檔案則可能會出錯,因此要把lseek,write作為一個原子操作.在windows平台,線程與進程在核心是等同的(?),所以多進程操作類似多線程.
FAQ1: 多級指標初始化
a) long* m_ltest1= new long;
b) long** m_cppValue1;
m_cppValue1 = new long* [3];
for(i = 0; i < 3; i++){ m_cppValue1[i] = new long [m_lMaxDocId]; }
c) long*** m_cppValue;
m_cppValue = new long**[M];
for(i = 0; i < M; i++){
m_cppValue[i] = new long*[N];
for(j = 0; j < N; j++){
m_cppValue[i][j] = new long;
}
}
//釋放記憶體時的順序剛好相反,先刪除最低層元素空間.
for(i = 0; i < M; i++){
for(j = 0; j < N; j++){
if(m_cppValue[i][j]) delete m_cppValue[i][j];
}
if(m_cppValue[i]) delete m_cppValue[i];
}
if(m_cppValue) delete m_cppValue;