【问题标题】:What can be the cause of "use of undeclared identifier LOG_LEVEL_VERBOSE" message“使用未声明的标识符 LOG_LEVEL_VERBOSE”消息的原因可能是什么
【发布时间】:2021-06-13 17:40:30
【问题描述】:

我正在尝试配置 cocoalumberjack,当我将 ddLogLevel 添加为 LOG_LEVEL_VERBOSE 时,XCode 会抛出“使用未声明的标识符”错误。这是为什么?如何避免?

【问题讨论】:

    标签: ios cocoalumberjack


    【解决方案1】:

    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

    【讨论】:

    • 我已经有了CSConstants.h,所以我按照建议将ddLogLevel放在那里。
    • 我认为现在是 DDLogLevelVerbose
    • @Droppy 但是 ddLogLevel 被 DDLogError 和那种宏使用,也就是说,在所有程序中都使用。在那种情况下将其添加到 PCH 中不是更好吗?谢谢。
    • @Ricardo 它可以在预编译头文件中声明(使用extern),但应该在单个源文件中定义
    【解决方案2】:

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

    【讨论】:

    • 您正在使用 CocoaLumberjack 与可可豆荚或作为框架?
    • 我正在使用 Cocoapods
    • 我更改为 @import CocoaLumberjack; 但出现错误 Module 'CocoaLumberjack' not found
    【解决方案3】:

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

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

    为什么不定义__OBJC__?前缀标头附加在 C、C++、Objective-C 和 Objective-C++ 文件中。由于__OBJC__只是为后两者定义的,如果你的项目中有C或C++文件,就会报错。

    知道了这一点,很明显ddLogLevel 定义应该在#ifdef __OBJC__ 检查内。但是,您应该按照 Droppy 所说的去做,并确保所有 Objective-C 导入都进入检查范围内。

    【讨论】:

      【解决方案4】:

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

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

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

      希望这对其他人有所帮助。

      【讨论】:

      • 我将 CocoaLumberjack 作为框架导入,但出现此错误:“使用未声明的标识符 ddloglevel”。我添加它#import“DDLegacyMacros.h”,但我收到此错误“DDLegacyMacros.h 文件未找到”
      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多