Добавление защитника include нарушает сборку

Я добавил #ifndef.. # define.. # endif в файл моего проекта и сбой компилятора. Как только я удаляю его или добавляю любое другое имя в определение, оно компилируется отлично. В чем может быть проблема?

Похоже, файл уже объявлен, но я не знаю, где. Я просто удаляю его, но я действительно хочу знать, почему это происходит.

error: expected class-name before ‘{’ token
error: ‘QDesignerFormEditorInterface’ has not been declared

И еще пара ошибок.

Я действительно использую пример из Qt, "Пример подключаемого модуля виджета".

Разница заключается в том, что я использую свой собственный класс для пользовательского виджета (файлы .h,.cpp и .ui).

Возможно, это связано с файлом, который содержит 2, хотя вот как это сделал пример.

Ответ 1

Этот макрос используется как включить охрану? Если это так, похоже, вы дублируете имя, используемое в другом месте. Это обычная проблема, когда люди не думают о том, в какой сфере действия должен присутствовать охранник, и вы должны включать в него гораздо больше информации, чем просто имя файла.

Включить цели защиты:

  • генерировать один раз при создании заголовка
  • никогда не задумываться о себе снова
  • вероятность дублирования меньше, чем ваш шанс выиграть в лотерею

Плохие включают имена охранников (для файла "config.h" ):

  • CONFIG_H
    • слишком общий
  • _CONFIG_H, CONFIG__H, CONFIG_H__, __CONFIG_H__ и т.д.
    • all reserved, все еще слишком общий
  • PROJECT_CONFIG_H
    • лучше, гораздо реже дублировать в несвязанных проектах
    • но по-прежнему нет информации о пути, легко дублировать в больших проектах

Хорошо включить имена охранников (для файла "config.h" ):

  • PATE_20091116_142045
    • что <last name>_<date>_<time>
    • не требуется проект, путь, имя файла.
    • легко печатать
      • Если ваш редактор имеет функцию вставки, вы можете "набрать" ее очень быстро
    • легко генерировать
      • включает порядковый номер при генерации, если вам нужно сгенерировать более одного раза в секунду
    • надежная гарантия универсальности.
  • INCLUDE_GUARD_726F6B522BAA40A0B7F73C380AD37E6B
    • сгенерированный из фактического UUID
      • надежная гарантия универсальности.
    • если он неожиданно появляется, "INCLUDE_GUARD" - хороший намек на то, что он есть, пока он служит для размещения его в отдельном пространстве имен (хотя условно, а не распознан языком).
    • при необходимости добавьте имя проекта (что часто требуется в директивах проекта для макросов)
    • легко написать собственную примерную программу для генерации

Ответ 2

Если вы добавите #ifndef для константы, которая уже определена, она всегда будет проверять значение true. Вы говорите "файл объявлен", но файлы не объявляются. Это действительно постоянная, которую вы ставите после #ifndef, которую вы должны проверять. Сделайте простой поиск по всему дереву источника и дважды проверьте, в каком порядке отображается текущий #define.

И, конечно же: ваш код правильный? Попробуйте указать имя мусора как константу и поместите #endif сразу после него: если все еще есть ошибки, у вас есть опечатки (вставьте код, если да). См. Также этот пост.

PS: Я вижу, что Дэвид Торнли печатал подобный совет в комментарии... извините, если это дублирует информацию в этом потоке.