用于调试日志的Objective-C预处理器表达式

时间:2011-12-02 04:34:56

标签: objective-c xcode c-preprocessor

我有一些像这样的代码:

#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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

#if defined只检查是否已定义该值,而不是它的值。 您可以使用#if检查某个值是否定义为零以外的值。

尽管如此,这仍然无效。预处理器在编译器之前运行,因此您无法在运行时使用它来切换代码。您需要在运行时检查默认值。