Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 1
1

Многоуровневое включение header-файла и ошибки компиляции

06.04.2015, 17:01. Показов 1032. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток!
Просмотрел аналогичные темы, но достаточно близких тем не обнаружил, потому создаю новую тему.

Суть проблемы. Есть компилятор си. К нему header-файл разработчика компилятора с синонимами целочисленных типов - types.h. В примере проекта, поставляемом разработчиком есть несколько уровней вложения types.h.
Так main.c содержит строки:

C
1
2
3
4
#include <types.h>
#include <lcd.h>
#include <leds.h>
#include <joystick.h>
..............................

В свою очередь, и lcd.h, и leds.h, и joystick.h содержат строку:
C
1
#include <types.h>
т.к. в них описаны прототипы функций, использующие аргументы типов, описанных в types.h.
Получается, что при компиляции main.c типы, описанные в types.h многократно переопределяются, но компилятор ошибок не выдаёт.

Пытаюсь делать, вроде бы, то же самое. Создаю файл m20xx.h со своими пользовательскими типами, правда, в отличие от types.h, содержит по большей части не синонимы, а сложные вложенные структуры, union'ы и enum'ы.
Создаю файлы с прототипами функций: m20xx_time.h, m20xx_spi.h, m20xx_can.h и т.д.
Во всех этих header-файлах есть по 2 строки:
C
1
2
#include <types.h>
#include <m20xx.h>
В main.c включаются все header-файлы:
C
1
2
3
4
5
#include <types.h>
#include <m20xx.h>
#include <m20xx_time.h>
#include <m20xx_spi.h>
#include <m20xx_can.h>
..............................

Если я в каждом из hedar-файлов с прототипами закомментирую строку "#include <m20xx.h>", компилятор выдаёт вполне ожидаемо ошибку в описании каждого из прототипов, имеющих типы аргументов, описанных в m20xx.h. Точнее говоря, каждый неизвестный компилятору аргумент генерирует 4 сообщения об ошибке:
"Declaration syntax",
"Identifer list in function declaration",
"Empty declaration"
и "Expecting data or function declaration".

Если же раскоментировать включение m20xx.h в каждом из файлов с описаниями прототипов функций, то ошибки возникают уже в самом m20xx.h. Каждая описанная мною структура (или union) сопровождаются сообщением:
"Imcompotible declaratio for ... (имя структуры или union'а)". У enum'ов, почему, то только отдельные элементы сопровождаются сообщением: "Duplicate name "ИМЯ"". Но хотя бы один компонент у каждогог enum'а таким сообщением сопровождён...

Я, конечно, могу всё это обойти (точнее говоря, пока так и обхожу). Фактически можно заставить препроцессор собрать всё в один линейный файл, а уже потом компилировать. Переношу все исходники и header-файлы, кроме main.c и m20xx.h в "параллельную" директорию, чтобы компилятор не видел (во вложенной всё равно видит, собака, а искать, есть ли соответствующий флажок в настройках проекта - в лом). Из всех собранных в общую директорию header- и с-файлов убираю все директивы #include.В файле m20xx.h оставляю только
#include <types.h>

А в main.c собираю последовательно, сначала все header'ы:
C
1
2
3
4
#include <m20xx.h>
#include <m20xx_time.h>
#include <m20xx_spi.h>
#include <m20xx_can.h>
................................... ,

а затем все с-файлы:

C
1
2
3
#include <m20xx_time.c>
#include <m20xx_spi.c>
#include <m20xx_can.c>
Но, во-первых, неизящно, а ИМХО некрасивые программы обычно криво работают, как некрасивые самолёты не летают. Во-вторых, не наглядно. Да и человеку со стороны объяснять сложно. Наверняка проблема решается. Ведь вложенность включений types.h проблем не вызывает...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2015, 17:01
Ответы с готовыми решениями:

Ошибки при компиляции файла exe
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Ошибки после компиляции на Visual Express 2012.Ошибки в теме
Добрый вечер ребят помогите пожалуйста.Программа написана на Visual Express 2012.Обясните что...

Многоуровневое меню из конфигурационного файла
Имею конфигурационный класс class Config { /** * @var array */ protected...

с2079 и с2228 ошибки при компиляции ниже участок кода, с которым праблема и скрины ошибки
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ bool game = true; // КЛАССЫ class Me; class mob { public: void...

1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.04.2015, 20:24 2
Bold, Есть специальный простой метод. И если ты посмотришь системные хедеры, ты его увидишь.
Пусть у тебя есть собственный хедер My.h
В его начале пишешь 2 строчки
C
1
2
#ifndef MY_H
#define MY_H
А в конце
C
1
#endif
Попробуй догадаться, что это дает...
Но после этого ты можешь свои хедеры включать друг в дружку, располагать почти в произвольной последовательности и жить совершенно счастливо
1
06.04.2015, 20:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2015, 20:24
Помогаю со студенческими работами здесь

Ошибки при компиляции - исправить ошибки в коде
Помогите исправить ошибки , не понимаю в чем может быть причина ... #include &lt;conio.h&gt;...

Включение/выключение try/catch по условию на этапе компиляции. Возможно ли это?
Всем доброго дня. При доработке и тестировании довольно большого проекта на ASP.NET (C#) возник...

Непонятная ошибка при компиляции: Не удается открыть файл включение
Доброго времени суток. Подскажите что не так. Написал программку, но у меня на компе она не...

Ошибки при использовании header'а
Собственно сама проблема: Имеется два файла, один со скриптом а второй в качестве шаблона. Во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru