什么可能是“使用未声明的标识符LOG_LEVEL_VERBOSE”消息的原因

时间:2014-08-04 06:25:01

标签: ios lumberjack

我尝试配置cocoalumberjack,当我添加ddLogLevel设置为LOG_LEVEL_VERBOSE XCode时,使用未声明的标识符"错误。这是为什么?怎么避免?

enter image description here

4 个答案:

答案 0 :(得分:8)

This question表示清除DerivedData并重新启动Xcode可以解决此类错误。

但是,您不应该在预编译的头文件中包含变量,因为它将包含在每个源文件中,并且前缀文件与普通头文件相比有些复杂。

最好是使用包含以下内容的Constants.h文件:

extern int ddLogLevel;

#import到您的前缀文件中。

然后使用:

创建Constants.m
int ddLogLevel =
#ifdef DEBUG
                 LOG_LEVEL_VERBOSE;
#else
                 LOG_LEVEL_ERROR;
#endif

这样只有ddLogLevel的一个实例,如果需要,可以在运行时轻松更改。

有关前缀文件最佳做法的提示,请参阅this question

答案 1 :(得分:6)

在为Objective-C项目使用Xcode 8.0时,为我解决的问题是将 quizSchema.find({_id: quiz_id}) .populate({ path: 'section.questions' }) 更改为#import <CocoaLumberjack/CocoaLumberjack.h>

答案 2 :(得分:2)

Droppy的帖子是正确的,我建议这样做,但我想直接解决这个问题。您的代码中存在可能导致错误的缺陷。

LOG_LEVEL_VERBOSEDDLog.h中定义。如果定义了DDLog.h,则您的头文件仅导入__OBJC__,但在没有此条件的情况下使用LOG_LEVEL_VERBOSE。因此,如果未定义__OBJC__,则LOG_LEVEL_VERBOSE将不确定。

为什么不定义__OBJC__?前缀标头前置于C,C ++,Objective-C和Objective-C ++文件。由于__OBJC__仅针对后两者定义,如果项目中有任何C或C ++文件,则会发生错误。

了解这一点,很明显ddLogLevel定义应该在#ifdef __OBJC__检查中。但是,您应该执行Droppy所说的内容,并确保所有Objective-C导入都在支票内。

答案 3 :(得分:1)

对于使用“CocoaLumberjack 2.X”且在pod更新后仍面临同样问题的用户,请尝试导入“DDLegacyMacros.h”。

对于前缀文件用户,请尝试以下方法:

#ifdef __OBJC__
...
...
    #import <DDTTYLogger.h>
    #import <DDLog.h>
    #import <DDLegacyMacros.h>
#endif

希望这有助于其他人。