Я пытаюсь отложить вызов функции (используя оболочку функции), сохраняя его аргументы в списке указателей void:
void *args[]
int 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]))
У меня есть две проблемы:
1) предупреждение: несоответствие типа указателя/целого в условном выражении, генерируемое определением макроса (обратите внимание, что я могу жить с ним, см. 2))
2) реальная проблема: длинный длинный аргумент не передается правильно (каждый раз получаю 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++;
}