在Xcode中声明C函数 / 用在debug和release模式下表现不同的替代方法取代NSLog

4

这是一个相当愚蠢的问题!但在下面的函数中,你如何使用传递的其余参数:

void NSLog(NSString *format, ...)
{
    //here I can use "format" but how can I use the remaining arguments?
}

很难回答这个问题,因为我无法搜索“...”?顺便说一下,这就是NSLog的工作原理,但我只是把它放在这里作为一个例子,我的问题与NSLog无关。


4
请阅读c-faq中的第15节。 - pmg
顺便提一下,这也是相关的:http://stackoverflow.com/questions/6002969/variadic-function-without-nil-termination - Ali
4个回答

5

使用可变参数列表:

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 

这是令牌粘贴运算符。它用于防止在没有其他参数的情况下传递逗号。 - pohsyb

4

请看stdarg.h

它可能看起来有些像 -

void NSLog(NSString *format, ...)
{

  va_list args;
  va_start(args,format);
  vprintf([format cString], args);
  va_end(args);
}

3

0

好的,谢谢大家,我按照你们给我的方向进行了操作,这是解决方案: 据我所知,没有通用/可移植的解决方案来解决接收可变数量参数并将它们传递给另一个接受可变数量参数的函数的问题(如此处所述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


你可以使用宏来完成同样的事情: #ifdef DEBUG #define DebugOnly_Log(x, args...) NSLog(format, ##args) #else #define DebugOnly_Log(x, args...) #endif - pohsyb
抱歉混乱了,我不知道如何在评论中实现代码格式。 - pohsyb
抱歉,我无法让它正常工作,您能否将其放在一个带有格式的“答案”中? - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接