Example:

void cond_printf(const char *format, ...)
{    
    char loc_buf[64];
    char * temp = loc_buf;
    va_list arg;
    va_list copy;
    va_start(arg, format);
    va_copy(copy, arg);
    size_t len = vsnprintf(NULL, 0, format, arg);
    va_end(copy);
    if(len >= sizeof(loc_buf)){
        temp = new char[len+1];
        if(temp == NULL) {
            return;
        }
    }
    len = vsnprintf(temp, len+1, format, arg);
    pc->printf( temp);
    va_end(arg);
    if(len > 64){
        delete[] temp;
    }    
}

Ta có thể gọi như sau

cond_printf(" Mechanical Angle:  %f    Electrical Angle:  %f    Raw:  %d\n\r", spi.GetMechPosition(), spi.GetElecPosition(), spi.GetRawPosition());

-> Ta dùng macro này để gọp các biến vào một cách nhanh chóng.

int vsnprintf(
   char *buffer,
   size_t count,
   const char *format,
   va_list argptr
);
The vsnprintf function returns the number of characters written, not counting the terminating null character.