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

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

Другие вопросы по тегам