(Visual Studio)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void F2(const char* fmt, va_list vl)
{
int i = va_arg(vl, int);
double d = va_arg(vl, double);
printf("i = %d, d = %lf\n", i, d);
}
void F(const char* fmt, ...)
{
va_list vl;
va_start(vl, fmt);
F2(fmt, vl);
va_end(vl);
}
void va_list_free(va_list args)
{
free(args);
}
va_list va_list_create(void* pmem, int i, double d)
{
va_list p = (va_list)pmem;
va_arg(p, int) = i;
va_arg(p, double) = d;
return (va_list)pmem;
}
va_list va_list_malloc(int i, double d)
{
void* pv = malloc(sizeof(int) + sizeof(double));
return va_list_create(pv, i, d);
}
int main()
{
F("", 1, 2.0);
va_list args = va_list_malloc(1, 2.0);
F2("", args);
va_list_free(args);
return 0;
}
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct X {
char a1;
char a2;
double a3;
void* a4;
char a5;
} X;
#define X_INIT {'a', 'b', 1.2, (void*)3 , 'c'}
#define _SLOTSIZEOF2(t) ((sizeof(t) + sizeof(t) - 1) & ~(sizeof(t) - 1))
#define _APALIGN2(t,ap) (((va_list)0 - (ap)) & (sizeof(t) - 1))
#define arg(ap, t) (*(t*)((ap += _SLOTSIZEOF2(t) + _APALIGN2(t,ap)) - _SLOTSIZEOF2(t)))
void Use(void* pv)
{
char* args = pv;
char a1 = arg(args, char);
char a2 = arg(args, char);
double a3 = arg(args, double);
void* a4 = arg(args, void*);
char a5 = arg(args, char);
}
int main()
{
printf("%d %d %d %d %d\n",
(int)offsetof(X, a1),
(int)offsetof(X, a2),
(int)offsetof(X, a3),
(int)offsetof(X, a4),
(int)offsetof(X, a5));
X x = X_INIT;
Use(&x);
return 0;
}
#define UnCapture5(data, t1, a1, t2, a2, t3, a3, t4 ,a4, t5, a5)\
struct X {\
t1 a1; \
t2 a2; \
t3 a3; \
t4 a4; \
t5 a5; \
} *p = (struct X*) (data);\
t1 a1 = p->a1;\
t2 a2 = p->a2;\
t3 a3 = p->a3;\
t4 a4 = p->a4;\
t5 a5= p->a5
#define Capture5(name, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5)\
struct {\
t1 a1;\
t2 a2;\
t3 a3;\
t4 a4;\
t5 a5;\
} name;\
name.a1 = a1;\
name.a2 = a2;\
name.a3 = a3;\
name.a4 = a4;\
name.a5 = a5
void F2(void* pv, size_t s)
{
UnCapture5(pv, char, a1,
char, a2,
double, a3,
void*, a4,
char , a5);
printf("%c %c %lf %p %c\n", a1, a2, a3, a4, a5);
}
void F1()
{
char a1 = 'a';
char a2 = 'b';
double a3 = 2.2;
void* a4 = 0;
char a5 = 'c';
Capture5(capture, char, a1,
char, a2,
double, a3,
void*, a4,
char, a5);
F2(&capture, sizeof(capture));
}
int main()
{
F1();
}