Что может быть причиной сообщения об использовании незаявленного идентификатора 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
Надеюсь, это поможет кому-то еще.