这是一个相当愚蠢的问题!但在下面的函数中,你如何使用传递的其余参数:
void NSLog(NSString *format, ...)
{
//here I can use "format" but how can I use the remaining arguments?
}
很难回答这个问题,因为我无法搜索“...”?顺便说一下,这就是NSLog的工作原理,但我只是把它放在这里作为一个例子,我的问题与NSLog无关。
这是一个相当愚蠢的问题!但在下面的函数中,你如何使用传递的其余参数:
void NSLog(NSString *format, ...)
{
//here I can use "format" but how can I use the remaining arguments?
}
很难回答这个问题,因为我无法搜索“...”?顺便说一下,这就是NSLog的工作原理,但我只是把它放在这里作为一个例子,我的问题与NSLog无关。
使用可变参数列表:
void NSLog(NSString *format, ...)
{
va_list ap;
va_start(ap, format);
while( (value = va_arg(args, NSString *) ){
// Do something with value. This is assuming they are all strings
}
// or pass entire list to another function
NSLog_VA( format, ap );
va_end(ap);
}
void NSLog_VA( NSString * format, va_list args )
{
// do something with va_list here
}
编辑: 由于您只需要调试日志:
#ifdef DEBUG
#define DebugOnly_Log(format, args...) NSLog(format, ##args)
#else
#define DebugOnly_Log(format, args...) // defined to nothing
#endif
请看stdarg.h
它可能看起来有些像 -
void NSLog(NSString *format, ...)
{
va_list args;
va_start(args,format);
vprintf([format cString], args);
va_end(args);
}
好的,谢谢大家,我按照你们给我的方向进行了操作,这是解决方案: 据我所知,没有通用/可移植的解决方案来解决接收可变数量参数并将它们传递给另一个接受可变数量参数的函数的问题(如此处所述http://c-faq.com/varargs/handoff.html)。
但我想要实现一个 NSLog 的替代品(我称之为 AliLog),在调试期间行为与 NSLog 相同,但在发布版本中不执行任何操作(或执行其他写入控制台之外的操作)。
这是我的解决方案:
void AliLog(NSString *format, ...)
{
#ifdef DEBUG
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
#else
// do nothing! or something that makes sense in a release version
#endif
}
这里的魔法在于NSLogv
。