関数定義の抽象化... Cで

えと,Soft Typingについては(まぁ分かるとこだけ型推論というのは誰でも思いつくことでしょう)Soft Schemeの実装についてちょっと解説を読んだら返答させていただきます.
本題: メタプログラミングとmulti-stage programmingとgenerative programmingの違いはどう定義されるのだろう.Web 2.0とかラノベみたいに各自が定義することなのかな.
そして何が言いたいのか自分でも分からないソース.関数定義の抽象化(特に,名前の扱いの抽象化).

#include <stdio.h>
#include <string.h>

#define BUFLEN 1024

#define DefFuncCorrespToHtmlElem(name)                          \
/* One which frees its argument and one which doesn't */        \
char *name(char *child)                                         \
{                                                               \
    return DefFuncCorrespToHtmlElemAux(#name, child, 1);        \
}                                                               \
char *name ## _s(char *child)                                   \
{                                                               \
    return DefFuncCorrespToHtmlElemAux(#name, child, 0);        \
}

char *DefFuncCorrespToHtmlElemAux(const char *elemName, char *child, int freeFlag)
{
    int len;
    char buf[BUFLEN], *retVal;
    sprintf(buf, "<%s>%s</%s>", elemName, child, elemName);
    if (freeFlag) free(child);
    len = strlen(buf);
    retVal = (char *)malloc(len);
    strncpy(retVal, buf, BUFLEN);
    return retVal;
}

DefFuncCorrespToHtmlElem(p)
DefFuncCorrespToHtmlElem(strong)

int main()
{
    printf("%s\n", p(strong_s("hello!")));
    return 0;
}

だからもうGCのない言語ではコード書かないって言ったやん... > 自分
例えばここで #namename と間違えると自由なint型変数と思われてしまって「第1引数の型がちがうにょ」と言われる(言われたのよ).しかしそういうエラーメッセージはよく分からない.やはり変形段階もきっちり言語処理系が把握してくれてるとうれしいかな.ちなみにCommon Lispだとそういうチェックは基本的に全くない.マクロは分割して書き,こまめにテストすることが推奨されており,「そうしてれば何とかなるだろ」みたいな.