在寫一個console程式時,想寫一個函數來處理輸出錯誤資訊,像下面這樣
void ExportError( LPCTSTR pError );
然後在裡面直接通過printf來列印資訊。
void ExportError( LPCTSTR pError )
{
printf( pError );
}
後來,想這個函數不夠方便,因為我們知道printf支援可變參數的。這樣列印一些錯誤資訊時很方便,如
printf( "Error No:%d", 1 );
那麼將自己的函數也改變成可變參數的
void ExportError( ... )
{
//???
}
但這時發現不知道如何將不定參數傳遞給printf了。
我們知道VC++提供了幾個宏,可以傳遞可變參數
<br /> TCHAR out[1024];<br /> va_list body;<br /> va_start(body, fmt);</p><p>// 但這裡就必須使用接收valist參數的函數了,如vsprintf,</p><p>vsprintf(out,fmt,body);</p><p>// 然後再輸出,可以發現多了out作為緩衝,這個緩衝要多大呢?很難確定</p><p>printf(out);<br /> va_end(body);}<br />
那麼有什麼辦法可以直接傳遞可變參數呢?如果對C語言結構比較熟悉的話,其實也不難,我們只要在中間給一個過渡層就可以了。
__declspec (naked)<br />void __cdecl ExitError( LPCTSTR pError, ... )<br />{</p><p> __asm<br /> {<br /> pop ebx<br /> call dword ptr [printf]<br /> push ebx<br /> ret<br /> }</p><p>}<br />
這樣首先用pop ebx儲存返回地址,再調用printf就直接將參數傳遞過去了,然後就恢複地址並返回。OK!
Debug及Release編譯通過.