【问题标题】:Objective-C Preprocessor Expression for Debug Log调试日志的 Objective-C 预处理器表达式
【发布时间】:2011-12-02 04:34:56
【问题描述】:

我有一些这样的代码:

#define FORCE_DEBUG_MODE [[[NSUserDefaults standardUserDefaults] valueForKey:@"forceDebugMode"] isEqualToString:@"1"]

#if defined DEBUG_MODE || defined FORCE_DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s),  ##__VA_ARGS__] )
#else
#define DLog( s, ... ) 
#endif

我从外面的一些文章中读到使用预处理 marcos 来定义 DEBUG_MODE,但是如果我将 NSUserDefaults 值设置为某个值,我想覆盖该模式。

这些代码没有错误。但似乎无论 FORCE_DEBUG_MODE 是什么,defined FORCE_DEBUG_MODE 都等于 true。我想要的是FORCE_DEBUG_MODE == 1

请告诉我是否可以这样做,以及如何做?

【问题讨论】:

    标签: objective-c xcode c-preprocessor


    【解决方案1】:

    您在检查上方定义了 FORCE_DEBUG_MODE 以查看它是否已定义。要检查它是否是真的,那么你必须只做|| FORCE_DEBUG_MODE 但是这也总是正确的,因为它只查看宏下是否有一些值 - 这一切都在预处理器中完成,这意味着这些代码都不会在运行时运行或重新运行 - 这些定义将定义实际编译的代码,而不是运行的代码

    【讨论】:

    • 我有一个秘密设置页面,我想在那里启用日志。无论如何要这样做?
    • 是的,所以在运行时检查是否设置了某些首选项设置,或者您想要检查它,然后在运行时决定是否应该记录。请注意,这意味着您将在代码中执行if (FORCE_DEBUG_MODE),以便它会进行运行时检查以查看它是否应该记录而不是实际更改已编译的代码
    • 我正在使用这种方式,一切顺利。谢谢~
    【解决方案2】:

    #if defined 只是检查值是否已经定义,而不是它是什么值。 您可以只使用#if 来检查一个值是否定义为非零值。

    不过,这仍然不适用于您的情况。预处理器在编译器之前运行,因此您不能使用它在运行时切换代码。您需要在运行时检查默认值。

    【讨论】:

    • 好的,很清楚。为什么我要覆盖是我的公司使用企业程序向我们的客户发布应用程序。我们有时想在他们身边监视日志以找出一些意外行为。但是我们不希望其他人访问日志。(无论谁有Xcode的mac都可以做到这一点)这种情况我该怎么办?
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 2011-12-03
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多