Что может быть причиной сообщения об использовании незаявленного идентификатора LOG_LEVEL_VERBOSE

Я пытаюсь настроить cocoalumberjack, и когда я добавил ddLogLevel, установленный в LOG_LEVEL_VERBOSE, XCode выдает ошибку "использование незаявленного идентификатора". Почему это? Как избежать?

enter image description here

Ответы

Ответ 1

Этот вопрос указывает, что очистка DerivedData и перезапуск Xcode разрешает эту ошибку.

Однако вы не должны включать переменные в предварительно скомпилированный заголовок, поскольку он будет включен в каждый исходный файл, а префиксные файлы несколько сложны по сравнению с обычными файлами заголовков.

Лучше использовать файл Constants.h, который содержит:

extern int ddLogLevel;

и #import, что в вашем префиксном файле.

Затем создайте Constants.m с помощью:

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

Таким образом, существует только один экземпляр ddLogLevel, и при необходимости его можно легко изменить во время выполнения.

См. этот вопрос для подсказок о лучших примерах префикса.

Ответ 2

Для меня это изменилось с помощью #import <CocoaLumberjack/CocoaLumberjack.h> to @import CocoaLumberjack; при использовании Xcode 8.0 для проекта Objective-C.

Ответ 3

Сообщение Droppys верное, и я рекомендую это сделать, но я хотел бы непосредственно задать вопрос. В коде есть ошибка, которая может привести к ошибке.

LOG_LEVEL_VERBOSE определяется в DDLog.h. Ваш файл заголовка импортирует DDLog.h, если __OBJC__ определен, но использует LOG_LEVEL_VERBOSE без этого условия. Поэтому, если __OBJC__ не определено, LOG_LEVEL_VERBOSE будет undefined.

Почему __OBJC__ не будет определен? Заголовок префикса добавляется к файлам C, С++, Objective-C и Objective-C ++. Поскольку __OBJC__ определяется только для последних двух, если в вашем проекте есть какие-либо файлы 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

Надеюсь, это поможет кому-то еще.