【问题标题】:How do you get the variables passed into function using macros (objective c)如何使用宏将变量传递给函数(目标 c)
【发布时间】:2010-09-25 04:22:16
【问题描述】:

有谁知道如何动态获取传递给函数的所有变量值以进行日志记录?

我正在寻找一种简单的方法(例如使用编译器宏)来记录函数以及传递给它的变量值(然后将其写入日志文件,以便我们可以轻松找到输入导致函数崩溃)

我一直在努力

#define NFDebug( s, ... ) NSLog( @"DEBUG: %s: %@", __PRETTY_FUNCTION__, \
[NSString stringWithFormat:(@"%@"), ##__VA_ARGS__] )

,它给出了一切,但变量值

【问题讨论】:

    标签: objective-c logging macros nslog


    【解决方案1】:

    我使用这样的东西:

    #ifdef YOUR_DEBUG_ENABLER_SYMBOL_ONLY_SET_IN_DEBUG_BUILDS
    #define DEBUG_ONLY(_code_) _code_
    #else
    #define DEBUG_ONLY(_code_)
    #endif
    
    #define DebugLog(_str, ...) DEBUG_ONLY(NSLog(@"%s: " _str, __func__, ## __VA_ARGS__))
    

    请注意,NSLog 中的 _str 之前没有逗号 - 这意味着您在调用代码中使用的字符串(由编译器)附加到“%s:”字符串以成为 NSLog 的复合格式字符串.您要打印的任何参数都可以包含在传入的格式字符串中。 %s 适用于 _ _ func _ _ 而您的 _str 适用于其余传入的变量:

    float f;
    int i;
    NSString* s;
    // Initialise f, i, and s to something
    ...
    // Log the values only when in debug mode, with function name auto-prepended
    DebugLog(@"float is: %f - int is: %d - string is: %@", f, i, s);
    

    这样做的好处是您可以记录任何您想要的文本和变量,有条件地进行调试,并且函数名称会自动附加到输出中。

    【讨论】:

    • 为了简单起见,我在上面省略了它,但实际上我有不同的日志级别(DebugLog0、DbugLog1 等),因此您可以设置所需的日志级别并根据需要获得更多/更少的日志记录.这可以通过两种方式完成:在编译时设置日志级别;或者在运行时设置日志级别。您可以轻松地添加/扩展它。拥有 DebugAssert、DebugWarn、ReleaseLog 和 ReleaseError 宏也很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多