This is what I found:

MSCV 2008 Epress:
stdarg.h: includes vadefs.h
vadefs.h: defines va_list
vadarg.h: 1st includes crtdefs.h, then defines va_list
crtdefs.h: 1st includes vadefs.h, 2nd defines va_list

WDK 2008 / WDK Win7:
stdarg.h: 1st includes crtdefs.h, 2nd includes vadefs.h
vadefs.h: 1st incldues crtdefs.h, 2nd defines va_list
vaargs.h: 1st incldues crtdefs.h, 2nd defines va_list
crtdefs.h: vadefs.h is commented out, defines va_list

So in the latter it's redundant.


tamlin@algonet.se wrote:
timo.kreuzer wrote:

  
In recent ms crt headers, va_list is defined in crtdefs.h,
    

Also in vadefs.h (at least for VC8), which is then (obvious) included 
by <stdarg.h>.

Do you have an example of an MS env. where including stdarg.h does not 
define va_list?