In this variant of the ErrorCode pattern, the actual error is encoded in the return code. Many APIs tend to do this. The return code is a value from an enumeration. So the idiom looks like: rv_Error e = rv_call(&result,a,b,c); if ( e!=RV_OK ) { fprintf(stderr,"error %d, %s\n", e, rv_ErrorText(e)); exit(1); } COM's HRESULT return code takes this even further, dividing the return code into specific bit fields, each with a specific function.