C 的不定參數函數轉寄,如printf

來源:互聯網
上載者:User

在寫一個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編譯通過.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.