假设我有一个带有可变数量参数的C函数:如何调用另一个函数,该函数需要从其内部获取可变数量的参数,并将所有参数传递到第一个函数中?
例:
void format_string(char *fmt, ...);
void debug_print(int dbg_lvl, char *fmt, ...) {
format_string(fmt, /* how do I pass all the arguments from '...'? */);
fprintf(stdout, fmt);
}
Run Code Online (Sandbox Code Playgroud) 是否可以在C编程语言中取消引用void指针而不使用类型转换?
另外,有没有任何方法可以概括一个可以接收指针并将其存储在void指针中的函数,并且通过使用该void指针,我们可以创建一个通用函数吗?
例如:
void abc(void *a, int b)
{
if(b==1)
printf("%d",*(int*)a); // If integer pointer is received
else if(b==2)
printf("%c",*(char*)a); // If character pointer is received
else if(b==3)
printf("%f",*(float*)a); // If float pointer is received
}
Run Code Online (Sandbox Code Playgroud)
我想在不使用if-else语句的情况下使这个函数变得通用 - 这可能吗?
此外,如果有很好的互联网文章解释了无效指针的概念,那么如果你能提供这些URL会很有用.
是否可以使用void指针进行指针算术?
所以我有2个函数都有相似的参数
void example(int a, int b, ...);
void exampleB(int b, ...);
Run Code Online (Sandbox Code Playgroud)
现在example
调用exampleB
,但是如何在不修改的情况下传递变量参数列表中的变量exampleB
(因为这已经在别处使用过了).
我想要一个辅助函数log
,基本上执行以下操作:
log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
Run Code Online (Sandbox Code Playgroud)
我有时间部分,我有文件写入部分.然而,问题是方法签名本身log
- 我应该放什么?这表示printf
声明以...
关键字结束,但我如何在我的函数中使用它?
void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
Run Code Online (Sandbox Code Playgroud)
让我编辑这个包含更多信息.
我有一个const char * now ()
返回"2014-02-03 16:33:00"形式的字符串.我想像这样传递另一个格式字符串.这两个陈述应该是等同的:
log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
Run Code Online (Sandbox Code Playgroud)
我知道这vfprintf
可以让我通过va_list
,但我怎么能把它now() …
如果某些条件为真,我只想打印 printf。我知道 printf 是一个可变参数函数,但遗憾的是我似乎无法在这里找到任何解释我可以包装它的线程。
基本上我写的代码中的每一个:
printf(" [text and format] ", ... args ...);
Run Code Online (Sandbox Code Playgroud)
我想写一些类似的东西
my_custom_printf(" [text and format] ", ... args ...);
Run Code Online (Sandbox Code Playgroud)
然后是这样实现的:
int my_custom_printf(const char* text_and_format, ... args ...)
{
if(some_condition)
{
printf(text_and_format, ... args...);
}
}
Run Code Online (Sandbox Code Playgroud)
条件的第一个版本将独立于 args(它将在某个全局变量上),但将来可能会成为需要的条件一个参数。
无论如何,现在我只需要... args ...
原型中的语法和my_custom_printf
.
我正在使用 GCC,但我不知道哪个 C 标准 - 但我们可以尝试一下。
我尝试将可变参数列表传递给另一个函数。已经有一个非常相似的问题:如何将可变数量的参数传递给 printf/sprintf 但对我来说它不起作用。我不知道为什么。这是我的功能:
void printSyslogNotice(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
#ifdef __XENO__
rt_syslog(LOG_NOTICE, fmt, ap);
#else
syslog(LOG_NOTICE, fmt, ap);
#endif
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
当我用以下方式调用它时:
printSyslogNotice("%s %i", "hello world", 5);
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:#010 -939524064
不用说,我想要这个输出:hello world 5
有人有想法吗?