Что может быть причиной сообщения "использование необъявленного идентификатора LOG_LEVEL_VERBOSE"
Я пытаюсь настроить cocoalumberjack, и когда я добавил ddLogLevel
установлен в LOG_LEVEL_VERBOSE
XCode выдает ошибку "использование необъявленного идентификатора". Это почему? Как избежать?
4 ответа
Этот вопрос указывает на то, что очистка 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>
в @import CocoaLumberjack;
, при использовании Xcode 8.0 для проекта Objective-C.
Сообщение Дроппи верно, и я рекомендую это сделать, но я бы хотел обратиться к вопросу напрямую. В вашем коде есть ошибка, которая может привести к ошибке.
LOG_LEVEL_VERBOSE
определяется в DDLog.h
, Ваш заголовочный файл только импортирует DDLog.h
если __OBJC__
определяется, но использует LOG_LEVEL_VERBOSE
без этого условия. Поэтому если __OBJC__
не определено, LOG_LEVEL_VERBOSE
будет неопределенным
Почему бы __OBJC__
не определиться? Заголовок префикса добавляется к файлам C, C++, Objective-C и Objective-C++. поскольку __OBJC__
определяется только для последних двух, если в вашем проекте есть файлы C или C++, тогда произойдет ошибка.
Зная это, ясно, что ddLogLevel
определение должно быть внутри #ifdef __OBJC__
проверять. Тем не менее, вы должны сделать то, что сказал Дроппи, а также убедиться, что весь импорт Objective-C идет внутри проверки.
Для людей, которые используют "CocoaLumberjack 2.X" и по-прежнему сталкиваются с той же проблемой после обновления модуля, попробуйте импортировать "DDLegacyMacros.h".
Для пользователей файлов префиксов попробуйте что-то вроде этого:
#ifdef __OBJC__
...
...
#import <DDTTYLogger.h>
#import <DDLog.h>
#import <DDLegacyMacros.h>
#endif
Надеюсь, это поможет кому-то еще.