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

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

Этот вопрос указывает, что очистка DerivedData и перезапуск Xcode разрешает эту ошибку.
Однако вы не должны включать переменные в предварительно скомпилированный заголовок, поскольку он будет включен в каждый исходный файл, а префиксные файлы несколько сложны по сравнению с обычными файлами заголовков.
Лучше использовать файл Constants.h, который содержит:
extern int ddLogLevel;
и #import, что в вашем префиксном файле.
Затем создайте Constants.m с помощью:
int ddLogLevel =
#ifdef DEBUG
LOG_LEVEL_VERBOSE;
#else
LOG_LEVEL_ERROR;
#endif
Таким образом, существует только один экземпляр ddLogLevel, и при необходимости его можно легко изменить во время выполнения.
См. этот вопрос для подсказок о лучших примерах префикса.
Для меня это изменилось с помощью #import <CocoaLumberjack/CocoaLumberjack.h> to @import CocoaLumberjack; при использовании Xcode 8.0 для проекта Objective-C.
Сообщение 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 импортируются в проверку.
Для людей, которые используют "CocoaLumberjack 2.X" и все еще сталкиваются с такой же проблемой после обновления pod, попробуйте импортировать "DDLegacyMacros.h".
Для пользователей файлов префикса попробуйте что-то вроде этого:
#ifdef __OBJC__
...
...
#import <DDTTYLogger.h>
#import <DDLog.h>
#import <DDLegacyMacros.h>
#endif
Надеюсь, это поможет кому-то еще.