【发布时间】:2013-08-06 14:00:01
【问题描述】:
我正在尝试推迟函数调用(使用函数包装器),方法是将其参数保存在 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]))
我有两个问题:
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++;
}
【问题讨论】:
-
function是如何声明的?如果它取决于参数,你如何决定调用哪个函数? -
看起来 libffi 接近你想要的,至少对于动态调度。它并不完全有助于延迟部分,但这可能特定于您所针对的平台。向我们提供有关您的平台(Linux、Windows、Mac OSX 等)的一些信息,我们可以为您提供更多帮助。
-
@jxh,
function就像 printf,它可以接受不同类型的参数。我需要的只是将正确转换(之前存储的)参数传递给函数。 -
@gg.kaspersky:
printf()从格式说明符中获取有关类型的提示。为什么不将argt传递给function()? -
@RichardJ.RossIII,我使用的是 Linux 的自定义版本,安装了有限的库。我依靠纯c。此外,我不需要基于超时的延迟,它不必是异步的。
标签: c