ABegin(c1); // ACleanクラスを宣言して初期化するマクロ Test a, b, c; Test_init(&a, c1); // こうすることで、AClean_out(c1)したときにdeinit()が自動で呼ばれるようになる. Test_init(&b, c1); Test_init(&c, c1); Test_say(&a, "hello"); ... AClean_out(c1); // これでa,b,cはdeinit()される(c,b,aの順に).
ABegin(c1); char *d = aMalloc(1234, c1); ... AClean_out(c1); // ここでfree(d)もしてくれる.
char *xsprintf(AClean *c, const char *f, ...)
{
char s[1024 * 1024];
va_list ap;
va_start(ap, f);
int l = vsnprintf(s, sizeof s, f, ap);
char *t = aMalloc(l + 1, c);
strcpy(t, s);
va_end(ap);
return t;
}char *s = "";
ABegin(c1);
for (i = 0; i < 100; i++)
s = xsprintf("%d %s", i, s);
puts(s);
AClean_out(c1);99 98 97 96 95 94 93 92 ... 9 8 7 6 5 4 3 2 1 0
ABegin(c1);
Matrix *A = Mat22_init(c1, 1, 2, 3, 4);
Matrix *B = Mat22_init(c1, 5, 7, 8, 6);
Matrix *C1 = A.add(c1, B).mul(c1, A.sub(c1, B)); // (A+B)*(A-B)
Matrix *C2 = A.mul(c1, A).sub(c1, B.mul(c1, B)); // A*A-B*B
C1.print("C1=");
C2.print("C2=");
AClean_out(c1);char *xsprintf2(AClean *c, const char *f, ...)
{
char s[1024 * 1024];
va_list ap;
va_start(ap, f);
int l = vsnprintf(s, sizeof s, f, ap);
if (strcmp(s, "0") == 0) return "0"; // この行を追加.
char *t = aMalloc(l + 1, c);
strcpy(t, s);
va_end(ap);
return t;
}