Most API functions do it in this way.
* return with error value - to check whats wrong
* parameter with struct size for version checking
* parameter with flags (bitfield) to mark the valid members
typedef enum
{
RESULTOK,
INVALIDPARAM,
BUFFERTOOSMALL,
} MYERRORS;
typedef struct
{
unsigned int cbStruct;
enum
{
VALUE1 = 1<<0,
VALUE2 = 1<<1,
VALUE3 = 1<<2,
RESULT = 1<<2,
};
unsigned int fValdMask;
unsigned int uiValue1;
short sValue2;
TCHAR* lpValue3;
unsigned int ccValue3;
unsigned int uiAnyResult;
} VARIABLE_RESULT_LIST;
MYERRORS MyVariableFunction(VARIABLE_RESULT_LIST* pVar)
{
if(!pVar)
return INVALIDPARAM;
if(sizeof(VARIABLE_RESULT_LIST)>pVar->cbStruct)
return BUFFERTOOSMALL;
if(VARIABLE_RESULT_LIST::VALUE1 & pVar->fValdMask)
{
pVar->uiAnyResult = 42 + pVar->uiValue1;
pVar->fValdMask |= VARIABLE_RESULT_LIST::RESULT;
}
else
{
pVar->fValdMask &= ~VARIABLE_RESULT_LIST::RESULT;
}
if(VARIABLE_RESULT_LIST::VALUE3 & pVar->fValdMask)
{
if(pVar->lpValue3 && (_tcslen(__T("Hello world"))<pVar->ccValue3))
_tcscpy_s(pVar->lpValue3,pVar->ccValue3,__T("Hello world"));
else
pVar->fValdMask &= ~VARIABLE_RESULT_LIST::VALUE3;
}
pVar->fValdMask &= ~VARIABLE_RESULT_LIST::VALUE2;
return RESULTOK;
}
void main()
{
VARIABLE_RESULT_LIST var = { sizeof(VARIABLE_RESULT_LIST), };
TCHAR str[256];
var.fValdMask = 0;
var.uiValue1 = 23;
var.fValdMask |= VARIABLE_RESULT_LIST::VALUE1;
var.lpValue3 = str;
var.ccValue3 = sizeof(str)/sizeof(str[0]);
var.fValdMask |= VARIABLE_RESULT_LIST::VALUE3;
if(RESULTOK==MyVariableFunction(&var))
{
if(VARIABLE_RESULT_LIST::VALUE1 & var.fValdMask)
_tprintf(__T("uiValue1: %i\r\n"),var.uiValue1);
if(VARIABLE_RESULT_LIST::VALUE2 & var.fValdMask)
_tprintf(__T("sValue2: %i\r\n"),(int)var.sValue2);
if(VARIABLE_RESULT_LIST::VALUE3 & var.fValdMask)
_tprintf(__T("lpValue3: %s\r\n"),var.lpValue3);
}
}
Regards.