有時為了快速的把代碼的架子搭起來,并編譯通過。會把一些負責具體實現(xiàn)細節(jié)的方法先空置。整個代碼能編譯通過后,再一邊調試一邊把那些空方法“填”好。
我一般是在這類空方法中加一個注釋進行標注, 并讓方法直接返回一個錯誤值。比如返回指針的方法就讓它返回NULL,返回BOOL值的方法就讓它返回false。有時還會在方法里放一個失敗的斷言,比如:
- BOOL some_function()
- {
- //PK Not implement yet
- assert(false);
- return FALSE;
- }
這樣如果實在忘了實現(xiàn)這個方法了,在調試時當代碼運動到這里時就會觸發(fā)斷言。
最近在新版的《windows核心編程》的附錄里看到一個超好的技巧,更好的解決了標注的問題。象上面我用的那兩個方法,還不是很方便。注釋法,需要自己 記得不停去全局搜特定的注釋,如果忘了搜,或是輸入注釋時敲錯了單詞,就容易漏掉。如果程序的邏輯沒有運行到放置了斷言的方法中,斷言法也就不起作用了。
《windows核心編譯》里提供的這個方法更好的解決了這些問題。它通過一個預處理指令(#pragma message)在編譯時輸出一行指定的信息,并且通過一個宏定義在指定的信息前輸出這個指令所在的文件名和行號。這樣我們就可以象操作編譯錯誤時一樣, 在output窗口中雙擊那一行信息,自動定位到指令所在的行上。
下面就是這個宏的定義:
- #define chSTR2(x) #x
- #define chSTR(x) chSTR2(x)
- #define chMSG(desc) message(__FILE__"("chSTR__LINE__)"):"#desc)
這個定義雖然簡單但很精巧,__FILE__和__LINE__是兩個預處理器定義的宏,值分別為當前的文件名和行號。#將它后面的的宏變量求值并字符串化。
建議直接把這三行COPY到stdafx.h頭文件中,這樣在工程的所有地方都可以引用。
利用這個宏,我們只需要在代碼里需要標注的地方輸入如下的行,注意括號內的內容不需要用引用括住,因為我們用了#進行字符串化。
- BOOL some_function()
- {
- #pragma chMSG(not implement yet)
- return FALSE;
- }
編譯時會在output窗口中產生類似下面的輸出:
- 1>d:\my_project\trunk\aural_superman\write_component_collection.cpp(86):not implement yet
雙擊就可以跳到相應的代碼行。
我在這個基礎上又加了一個宏:
- #define NOT_IMPLEMENT_YET chMSG(not implement yet)
這樣只需要以下行:
- #pragma NOT_IMPLEMENT_YET
就可以做標記了。
用這種方式,還可以定義很多其他的標記。比如:對需要在以后進行優(yōu)化的地方,我們可以定義以下的標記宏:
- #define OPTIMIZATION chMSG(should be optimized)
由于#在預處理指令里有特殊功能,而預處理系統(tǒng)又不提供轉義符。所以我沒找到方法把#pragma也塞到宏定義里面去。如果可以放進去的話,會更簡潔。哪位達人如果知道方法的話,請記得告訴我。
最后附上這個技術在我們組內推廣后,大家的個性化定義,和相應的編譯輸出截圖:
- #define chSTR2(x) #x
- #define chSTR(x) chSTR2(x)
- #define chMSG(desc) message(__FILE__"("chSTR(__LINE__)"):"#desc)
- #define NOT_IMPLEMENT_YET chMSG(暫時注掉,記得恢復)
- #define NIY_PK chMSG(油漆未干,請聯(lián)系rocky)
- #define NIY_DT chMSG(想要嘗鮮,請聯(lián)系bill)
- #define NIY_JULIE chMSG(我的游戲奮斗中o(︶︿︶)o ,請聯(lián)系julie)
cxzforever