Добавление include guard нарушает сборку - PullRequest
3 голосов
/ 16 ноября 2009

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

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

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

И пара других ошибок.

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

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

Это может иметь отношение к файлу, который имеет 2 включения, хотя так было в примере.

Ответы [ 2 ]

29 голосов
/ 16 ноября 2009

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

Включить цели охраны:

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

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

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

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

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

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

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

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

...