Re: coding style
"Jim Johnson" <aopiyy001@yahoo.com> ha scritto nel messaggio
news:lgldv39oat9jm42ur9m2n974l4h6gr3cfn@4ax.com...
=================
CATCHERROR(m_Cnn,0)
=================
#define CATCHERROR(ptr,a) catch(_com_error &e)\
{\
ErrorHandler(e,m_ErrStr);\
ptr=NULL;\
return a;\
}
The above is C++ code, because it uses 'catch' to catch exception
(_com_error &), and I believe it is not possible in pure C.
The CATCHERROR seems a preprocessor macro defined to avoid repeating
boiler-plate code.
Frankly speaking, if this macro is used wisely and not abused, I would not
define that bad code.
*Sometimes* preprocessor macros can come in handy.
e.g. I read some DirectShow SDK and COM code that uses HRCALL macro. It is
also available on MSDN.
<code>
// Macro that calls a COM method returning HRESULT value:
#define HRCALL(a, errmsg) \
do { \
hr = (a); \
if (FAILED(hr)) { \
dprintf( "%s:%d HRCALL Failed: %s\n 0x%.8x = %s\n", \
__FILE__, __LINE__, errmsg, hr, #a ); \
goto clean; \
} \
} while (0)
</code>
<code>
// Helper function that put output in stdout and debug window
// in Visual Studio:
void dprintf( char * format, ...)
{
static char buf[1024];
va_list args;
va_start( args, format );
vsprintf_s( buf, format, args );
va_end( args);
OutputDebugStringA( buf);
printf("%s", buf);
}
// Helper function to create a DOM instance:
IXMLDOMDocument * DomFromCOM()
{
HRESULT hr;
IXMLDOMDocument *pxmldoc = NULL;
HRCALL( CoCreateInstance(__uuidof(MSXML2::DOMDocument30),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IXMLDOMDocument),
(void**)&pxmldoc),
"Create a new DOMDocument");
HRCALL( pxmldoc->put_async(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE),
"should never fail");
return pxmldoc;
clean:
if (pxmldoc)
{
pxmldoc->Release();
}
return NULL;
}
</code>
My 2 cents.
Giovanni