15

我正在尝试配置 cocoalumberjack,当我将ddLogLevelset 添加到LOG_LEVEL_VERBOSEXCode 时会引发“使用未声明的标识符”错误。这是为什么?如何避免?

在此处输入图像描述

4

4 回答 4

8

这个问题表明清除DerivedData并重新启动Xcode可以解决这种错误。

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

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

extern int ddLogLevel;

并将#import其放入您的前缀文件中。

然后创建一个Constants.m

int ddLogLevel =
#ifdef DEBUG
                 LOG_LEVEL_VERBOSE;
#else
                 LOG_LEVEL_ERROR;
#endif

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

有关前缀文件最佳实践的提示,请参阅此问题

于 2014-08-04T06:47:45.720 回答
6

在将 Xcode 8.0 用于 Objective-C 项目时,为我解决的问题是更改#import <CocoaLumberjack/CocoaLumberjack.h>为.@import CocoaLumberjack;

于 2016-10-16T09:46:47.487 回答
2

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

LOG_LEVEL_VERBOSE中定义DDLog.hDDLog.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 导入都进入检查范围内。

于 2015-04-14T12:40:00.267 回答
1

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

对于前缀文件用户,请尝试以下操作:

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

希望这对其他人有帮助。

于 2015-04-14T11:34:58.937 回答