реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прозрачность программы для компилятора, Почему иногда приходится обьявлять одни и теже инклюды
Waso
сообщение Oct 30 2007, 11:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Насколько я понимаю, инклюд, обьявленный в начале файла должен быть виден во всех последующих инклюдах программы. Согласно Кернигану и Риччи, предпроцессор заменяет директиву #include на содержимое файла, на который она указывает. Однако в ИАРе для успешной компиляции некоторые инклюды приходится втыкать чуть ли не в каждый файл проекта. Плюс к тому, с-шные файлы вообще не участвуют в инклюдах, а обращение к их функциям происходит через прототипы функций одноименных хедеров. Нестыковочка.

Подскажите пожалуйста, как можно избавиться от сабжевой проблемы, в чем могут быть ее причины? Общие ответы типа "в кривости кода" - не в счет.


PS Пользую IAR EWARM 4.40A
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 30 2007, 12:03
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Waso @ Oct 30 2007, 14:43) *
Однако в ИАРе для успешной компиляции некоторые инклюды приходится втыкать чуть ли не в каждый файл проекта.
Каждый .c -файл, входящий в проект, компилируется отдельно (и называется единицей компиляции). При этом компилятор понятия не имеет о других файлах (единицах компиляции) и, следовательно, о включенных в них инклюдах. Все инклюды, которые вам могут понадобиться в этом .c надо в него включить.
Цитата(Waso @ Oct 30 2007, 14:43) *
Плюс к тому, с-шные файлы вообще не участвуют в инклюдах, а обращение к их функциям происходит через прототипы функций одноименных хедеров. Нестыковочка.
Стыковочка. На этапе компиляции из заголовочных файлов берутся прототипы (описания) функций, благодаря которым компилятор знает, что существует функция с таким именем, знает с какими параметрами функция должна вызываться и значение какого типа должна возвращать. За соблюдением этих типов и следит компилятор. А уже линкер в места вызова функций подставляет конкретные адреса. При этом тело и место вызова могут находиться в разных единицах компиляции. Можете поискать в гугле по ключевым словам "раздельная компиляция".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 30 2007, 12:08
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Проблема не в кривости кода а в недопонимании.
Во первых, как Вы правильно сказали
Цитата
предпроцессор заменяет директиву #include на содержимое файла
, но это в том файле, где этот include стоИт. С какой стати он должен быть виден в других файлах проекта, где Вы его ставить не желаете?
Компилятор в каждый момент времени работает только с одним С/С++ файлом проекта и учитывает только входящие в него include. Нестыковки здесь нет.
Во вторых, если в файле несколько include, то каждый последующий видит содержимое предыдущих, но не наоборот, и это логично. Таким образом получается возможная зависимость от порядка. Чтобы её избежать применяются различные ходы вроде включения include в хедеры (и это тоже логично, поскольку есть некоторые зависимости), при этом все хедеры должны иметь охранные директивы, о чём многократно писалось на форуме.

PS Как всегда, не успел за Сергеем Борщом wink.gif
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 30 2007, 12:16
Сообщение #4


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Waso @ Oct 30 2007, 14:43) *

Кроме выше сказанного, могу предложить вариант создания файла all.h
со всеми включениями, а потом включать только его.
Go to the top of the page
 
+Quote Post
Waso
сообщение Oct 30 2007, 12:36
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Благодарю.
Начинает доходить. smile.gif

Значит любой с-файл включенный в проект будет компилироваться и отгрызать место даже если я закоментирую инклюд с его хедером??

Насчет охранных директив и порядка следования я в курсе. Тем больше удивлялся когда повторное включение хедера с охранной директивой изменяло результат компиляции. Но теперь ясно.

alexander55 отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции.
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 30 2007, 12:41
Сообщение #6


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Waso @ Oct 30 2007, 18:36) *
Значит любой с-файл включенный в проект будет компилироваться и отгрызать место даже если я закоментирую инклюд с его хедером??

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 30 2007, 12:50
Сообщение #7


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Waso @ Oct 30 2007, 15:36) *
alexander55 отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции.

Используется широко.
Файл all.h
#ifndef allH
#define allH
...
#endif
Go to the top of the page
 
+Quote Post
ig_z
сообщение Oct 30 2007, 13:37
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(Waso @ Oct 30 2007, 16:36) *
alexander55 отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции.

Отличную идею нужно довести до конца!
1 склеим все хедеры в один
2 склеим все сишники в один
3 склеим склееное в один супер сишник
4 выкинем лишнее, оставшееся от хедеров
Получаем удовольствие 08.gif
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 30 2007, 13:52
Сообщение #9


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(ig_z @ Oct 30 2007, 16:37) *
Отличную идею нужно довести до конца!
1 склеим все хедеры в один
2 склеим все сишники в один
3 склеим склееное в один супер сишник
4 выкинем лишнее, оставшееся от хедеров
Получаем удовольствие 08.gif

Давайте без фанатизма и экстремизма. biggrin.gif
Но все мечтают видеть все, сразу, вместе и чтобы было все ясно и наглядно !
PS. И хорошо бы, чтобы и работало без вопросов. 07.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 30 2007, 14:21
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Waso @ Oct 30 2007, 15:36) *
отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции.

Полезно объявлять только то, что реально используется в данном *.с файле. Это поможет понять, что происходит, тому бедолаге, который когда-нибудь будет вынужден разбираться в этом коде.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 30 2007, 14:33
Сообщение #11


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(scifi @ Oct 30 2007, 17:21) *
Полезно объявлять только то, что реально используется в данном *.с файле. Это поможет понять, что происходит, тому бедолаге, который когда-нибудь будет вынужден разбираться в этом коде.

Это желательно, но не обязательно (но стремиться к этому надо).
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Oct 31 2007, 04:50
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(alexander55 @ Oct 30 2007, 17:16) *
Кроме выше сказанного, могу предложить вариант создания файла all.h
со всеми включениями, а потом включать только его.


Мне эта идея раньше нравилась тоже, но сейчас уже нет, после того, как я некоторое время поработал по такой системе.
Если проект достаточно большой, содержит несколько десятков исходников, начинает напрягать пересборка всего при малейшей правке в любом хедере.
Например, последние проекты на Fujitsu FFMC, которые я делал, выливались где-то в 100 кБ бинарного кода. Время компиляции всех файлов проекта занимает порядка минуты. Это уже существенно, чтобы такой подход начал напрягать.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 31 2007, 05:42
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Полностью присоединяюсь к Andy Mozzhevilov - избыточные включения - перекомпиляция всего при любом изменении.
Кроме того, если вы явно включаете только то, что нужно - вы четко знаете зависимости. Если вы включаете все - у вас все зависит от всего, ни о каких зависимостях говорить не получается. А в сколь-нибудь больших проектах без инкапсуляции очень сложно...
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 31 2007, 05:58
Сообщение #14


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Andy Mozzhevilov @ Oct 31 2007, 07:50) *

Я согласен. Не может быть все со знаком плюс, чем то приходится поступиться.
Главное - не принципами ! biggrin.gif
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 2 2007, 09:28
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Линкер выдает такую ошибку:
Код
Error[e27]: Entry "AT91F_ADC_CfgModeReg" in module BasicWEB ( ..\BasicWEB.r79 ) redefined in module SAM7_EMAC ( ..\SAM7_EMAC.r79 )
В обоих указан инклюд, в котором находится конфликтующая ф-я. Причом она инлайновая.
#include <lib_AT91SAM7X256.h>
С АЦП я вообще не работаю. Охранные директивы в этом хедере есть. В чем проблема?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016