|
Прозрачность программы для компилятора, Почему иногда приходится обьявлять одни и теже инклюды |
|
|
|
Oct 30 2007, 12:03
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 30 2007, 12:08
|

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

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

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

|
Благодарю. Начинает доходить. Значит любой с-файл включенный в проект будет компилироваться и отгрызать место даже если я закоментирую инклюд с его хедером?? Насчет охранных директив и порядка следования я в курсе. Тем больше удивлялся когда повторное включение хедера с охранной директивой изменяло результат компиляции. Но теперь ясно. alexander55 отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции.
|
|
|
|
|
Oct 30 2007, 12:50
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Waso @ Oct 30 2007, 15:36)  alexander55 отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции. Используется широко. Файл all.h #ifndef allH #define allH ... #endif
|
|
|
|
|
Oct 30 2007, 13:37
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(Waso @ Oct 30 2007, 16:36)  alexander55 отличная идея! На первый взгляд. Почему тогда такой прием широко не используется? Врядли для того чтобы сократить время компиляции. Отличную идею нужно довести до конца! 1 склеим все хедеры в один 2 склеим все сишники в один 3 склеим склееное в один супер сишник 4 выкинем лишнее, оставшееся от хедеров Получаем удовольствие
|
|
|
|
|
Oct 30 2007, 13:52
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(ig_z @ Oct 30 2007, 16:37)  Отличную идею нужно довести до конца! 1 склеим все хедеры в один 2 склеим все сишники в один 3 склеим склееное в один супер сишник 4 выкинем лишнее, оставшееся от хедеров Получаем удовольствие  Давайте без фанатизма и экстремизма. Но все мечтают видеть все, сразу, вместе и чтобы было все ясно и наглядно ! PS. И хорошо бы, чтобы и работало без вопросов.
|
|
|
|
|
Oct 31 2007, 04:50
|

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

|
Цитата(alexander55 @ Oct 30 2007, 17:16)  Кроме выше сказанного, могу предложить вариант создания файла all.h со всеми включениями, а потом включать только его. Мне эта идея раньше нравилась тоже, но сейчас уже нет, после того, как я некоторое время поработал по такой системе. Если проект достаточно большой, содержит несколько десятков исходников, начинает напрягать пересборка всего при малейшей правке в любом хедере. Например, последние проекты на Fujitsu FFMC, которые я делал, выливались где-то в 100 кБ бинарного кода. Время компиляции всех файлов проекта занимает порядка минуты. Это уже существенно, чтобы такой подход начал напрягать.
--------------------
Пасу котов...
|
|
|
|
|
Nov 2 2007, 09:28
|

Местный
  
Группа: Свой
Сообщений: 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> С АЦП я вообще не работаю. Охранные директивы в этом хедере есть. В чем проблема?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|