C 的不定参数函数转发,如printf

在写一个console程序时,想写一个函数来处理输出错误信息,像下面这样

 

void ExportError( LPCTSTR pError );

 

然后在里面直接通过printf来打印信息。

 

void ExportError( LPCTSTR pError )

{

    printf( pError );

}

 

后来,想这个函数不够方便,因为我们知道printf支持可变参数的。这样打印一些错误信息时很方便,如

printf( "Error No:%d", 1 );

 

那么将自己的函数也改变成可变参数的

void ExportError( ... )

{

    //???

}

 

但这时发现不知道如何将不定参数传递给printf了。

 

我们知道VC++提供了几个宏,可以传递可变参数

TCHAR out[1024]; va_list body; va_start(body, fmt); // 但这里就必须使用接收valist参数的函数了,如vsprintf, vsprintf(out,fmt,body); // 然后再输出,可以发现多了out作为缓冲,这个缓冲要多大呢?很难确定 printf(out); va_end(body);}

 

那么有什么办法可以直接传递可变参数呢?如果对C语言结构比较熟悉的话,其实也不难,我们只要在中间给一个过渡层就可以了。

 

__declspec (naked) void __cdecl ExitError( LPCTSTR pError, ... ) { __asm {     pop ebx call dword ptr [printf]      push ebx ret } }

 

这样首先用pop ebx保存返回地址,再调用printf就直接将参数传递过去了,然后就恢复地址并返回。OK!

 

Debug及Release编译通过.

你可能感兴趣的:(c,list,语言)