Arlleex 178 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба Наш ПЛИСовод ехидно посмеялся... У него некоторые проекты по паре-тройке часов собираются на довольно неслабом ПК @haker_fox, а у Вас IAR? Не знаю, как там, но вот в Keil, если снять галки с "Debug Information", "Browse Information", компиляция проходит гораздо быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 13 минут назад, jcxz сказал: Так не надо все .h включать во всё сразу. И не будет "тянуть". По уму .h-файлы нужно включать только туда, куда нужно. Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 2 минуты назад, ViKo сказал: Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется. Вы невнимательно прочитали пост, на который я отвечал. Или не поняли его. Перечитайте его ещё раз. "Повторное включение" тут не при чём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 3 минуты назад, ViKo сказал: Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется. По разу в месте его включения и до конца файла. Но не один раз в одном проекте. Защита от многократного включения вовсе не для этого. Она для случая, когда a.h: #define A 100 b.h: #include "a.h" #define B A*2 main.c: #include "a.h" #include "b.h" // вот тут будет фаталити А так, при разворачивании модуля (исходного файла), первым будет выполнена операция получения полного исходника - будут включены все нужные заголовочные файлы, развернутся макросы и т.д., и только потом все это будет подано на вход компайлеру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба Только что, jcxz сказал: Вы невнимательно прочитали пост, на который я отвечал. Или не поняли. Его перечитайте его ещё раз. Повторное включение тут не при чём. Я понял. Не включать то, что не нужно вообще. Что это за совет? Примерно, как не есть ножом. Очевидно же. 1 минуту назад, Arlleex сказал: По разу в месте его включения и до конца файла. Но не один раз в одном проекте. Именно, что один раз на весь проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 4 минуты назад, ViKo сказал: Именно, что один раз на весь проект. Вы заблуждаетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 15 minutes ago, jcxz said: Тогда Вы какие-то сказки рассказываете. И точно. Не туда посмотрел. Файлов у меня 217))) Так что нормально. 15 minutes ago, Arlleex said: @haker_fox, а у Вас IAR? Да, ИАР. 8.40.1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 20 минут назад, ViKo сказал: Я понял. Не включать то, что не нужно вообще. Что это за совет? Примерно, как не есть ножом. Очевидно же. Это означает, что например в файлах USB-драйвера подключать только .h-файлы, касающиеся самого USB-драйвера или общие .h-файл проекта. И не включать например .h-файлы SPI-драйвера или I2C-драйвера или файлы TCP стека и т.д. Тогда при изменении например .h-файла из SPI-драйвера не будут перекомпилироваться все исходники проекта, а только те исходники, которые зависимы от этого .h-файла (файлы SPI-драйвера + может ещё несколько зависимых). Цитата Именно, что один раз на весь проект. Вы неправы. Arlleex вам уже написал это. Включите генерацию .i-файлов и загляните в них - убедитесь. 16 минут назад, haker_fox сказал: И точно. Не туда посмотрел. Файлов у меня 217))) Так что нормально. Когда вернусь в Ригу, то смогу измерить сколько занимает компиляция этого же проекта на аналогичном i5-3570 с 24гиг ОЗУ и SSD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба https://ru.wikipedia.org/wiki/Pragma_once https://docs.microsoft.com/en-us/cpp/preprocessor/once?view=vs-2019 Цитата The use of #pragma once can reduce build times, as the compiler won't open and read the file again after the first #include of the file in the translation unit. It's called the multiple-include optimization. It has an effect similar to the include guard idiom, which uses preprocessor macro definitions to prevent multiple inclusions of the contents of the file. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 7 часов назад, ViKo сказал: https://ru.wikipedia.org/wiki/Pragma_once https://docs.microsoft.com/en-us/cpp/preprocessor/once?view=vs-2019 Ну и? Черным по белому же написано ровно то, о чем я и писал. И даже если тупо в гугл транслит запихнуть приведенную Вами цитату, получим Цитата Однократное использование #pragma может сократить время сборки, поскольку компилятор не будет открывать и снова читать файл после первого #include для файла в модуле перевода. Это называется многократной оптимизацией. Он имеет эффект, подобный идиому include guard, который использует макроопределения препроцессора для предотвращения многократного включения содержимого файла. Хоть перевод машинный, основную идею он передал в первозданном и однозначно понимаемом виде, разве нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 7 минут назад, Arlleex сказал: не будет открывать и снова читать файл Вы так говорили? 41 минуту назад, Arlleex сказал: По разу в месте его включения Вот как вы говорили. То есть, вы по прежнему считаете, что #pragma once защищает от неоднократного включения в один файл? Ладно... в единицу компиляции. А когда разруливаются многократные определения? При сборке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 9 минут назад, ViKo сказал: Вы так говорили? Я так не говорил. Это переведенная (даже не мной, а гугл-транслитом) Ваша цитата. Из каких-то там источников. 9 минут назад, ViKo сказал: Вот как говорили. Еще раз: pragma once (возможно) один раз считывает из файла его содержимое, а потом тупо подставляет это содержимое (уже прочитанное) каждый раз в то место, где этот #include подключается. Да, это оптимизирует время. Но Вы утверждали, что это содержимое включается один раз за весь проект. Или Вам тоже эту цитату привести? Вот, пожалуйста 48 минут назад, ViKo сказал: Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется. 45 минут назад, ViKo сказал: Именно, что один раз на весь проект. Считывается из файла и подставляется в точке подключения - это разные вещи. Да и pragma once будет работать ~также как #ifndef-#define-#endif, а время сборки проекта будет зависеть от того, было ли изменено содержимое этого .h-ника. И если было, разумеется, все модули, где этот .h подключался, будут перекомпилированы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 56 минут назад, ViKo сказал: А когда разруливаются многократные определения? При сборке? На этапе препроцессирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 19 минут назад, Arlleex сказал: На этапе препроцессирования. Если в .h файле определена inline функция, как спасёт препроцессор (работающий автономно для каждой единицы трансляции) от многократного определения функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 24 минуты назад, ViKo сказал: Если в .h файле определена inline функция, как спасёт препроцессор (работающий автономно для каждой единицы трансляции) от многократного определения функции? Спасёт голова программиста. Которая должна иметься в наличии. Программист, обладающий ею, будет подключать .h-файлы только в те .c(pp), где они реально нужны. А не во все подряд. Я об этом уже писал выше. А если не включать все необходимые заголовочники в каждый компилируемый файл исходников, то как Вы себе представляете возможность многопоточной компиляции, при которой компилируемые исходники равномерно распределяются между ядрами CPU? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться