引数をvoidポインターのリストに保存することにより、関数呼び出しを(関数ラッパーを使用して)延期しようとしています:
void *args[]
int argt[]
argt は、void * の場所に格納されているデータ型を記憶するために使用されます。
後で、延期された関数を呼び出す必要があります。
function(args[0], args[1])
しかし問題は、それらの型を正しく指定しなければならないことです。
次のようなマクロを使用します。
#define ARGTYPE(arg, type) type == CHARP ? (char *) arg : (type == LONGLONG ? *((long long *) arg) : NULL)
関数呼び出しは次のようになります。
function(ARGTYPE(args[0], argt[0]), ARGTYPE(args[1], argt[1]))
2 つの問題があります。
1) 警告: マクロ定義によって生成された条件式のポインター/整数型の不一致 (2) を参照してください)
2) 本当の問題: long long 引数が正しく渡されません (毎回 0 になります)
明らかに何かが欠けているので、マクロが正しく機能しない理由を (詳細に) 説明したり、別のアプローチを提案したりできますか?
EDIT
: ここに引数の保存部分を追加します (関連する詳細、va_list を解析します)。形式指定子に基づいて型を取得します。
while (*format)
{
switch(*format)
{
case 's':
saved_arguments[i] = strdup(arg);
break;
case 'l':
saved_arguments[i] = malloc(sizeof(long long));
*((long long *) saved_arguments[i]) = arg;
break;
}
i++;
format++;
}