-
- А нет какой-нить программки, которая генерировал бы граф зависимостей этих самых include? Да хоть в виде исходника для того же GraphViz? - Dingo(16.04.2025 11:39)
- Короче - я гоню :-) В варианте 2 будет рекурсия. Так точно делать
нельзя. Остается - страдать :-) - il-2(14.04.2025 13:16)
- По классике "помучиться". SciFi(1 знак., 14.04.2025 13:19, картинка)
- Зачем городить макросы, когда есть pragma once? - Eddy_Em(14.04.2025 13:01)
- у мну не заработало (или ручки кривоваты, или для AVR ASM2 сишный
препроцессор кастрирован :( - Adept(14.04.2025 13:21)
- Какой смысл на асме писать, если С есть? На С и кода гораздо
меньше, и шансов ошибиться. - Eddy_Em(14.04.2025 17:01)
- смысл в абсолютной прозрачности кода и полном контроле над
процессом :) Ну и опять же ж - с интересом наблюдаю тут иногда
стенания по поводу всяких оптимизаций, что "вот тогда работало, а
щас нет и непнятно в чём трабл" :)), да, с Си полегче с
математикой, или если активно используешь чужие
библиотекивелосипеды, которые обычно больно бьют по яйцам :)) И давно известно, что Adept(1783 знак., 14.04.2025 17:44)
- смысл в абсолютной прозрачности кода и полном контроле над
процессом :) Ну и опять же ж - с интересом наблюдаю тут иногда
стенания по поводу всяких оптимизаций, что "вот тогда работало, а
щас нет и непнятно в чём трабл" :)), да, с Си полегче с
математикой, или если активно используешь чужие
- Да не, просто компьютер чувствует асмовода и не отгружает ему
сишную годноту :-) - SciFi(14.04.2025 13:25)
- как так "мы ж с ним одной крови" (С) :)) можно сказать
одни машинные кодыиз одной тарелки хлебаем :))) - Adept(14.04.2025 13:29)
- как так "мы ж с ним одной крови" (С) :)) можно сказать
- Какой смысл на асме писать, если С есть? На С и кода гораздо
меньше, и шансов ошибиться. - Eddy_Em(14.04.2025 17:01)
- у мну не заработало (или ручки кривоваты, или для AVR ASM2 сишный
препроцессор кастрирован :( - Adept(14.04.2025 13:21)
- Каждому h-файлу - своё заграждение? - Toчкa oпopы(14.04.2025 12:56)
- аналогично и в ассемблере (там препроцессор Си), я пришёл к тому, что в каждой библиотеке прописываю подключение своих заголовков, и не использую одинаковых символических имён. Со взаимозависимыми определениями приходится бороться порядком прописывания инклюдов в главном файле, вроде как на помощь должна приходить директива "pragma", но я так и не смог с ней разобраться. - Adept(14.04.2025 12:44)
- И более того - я сейчас глянул исходники нескольких очень приличных
библиотек - везде в заголовочниках используется вариант 1 - il-2(14.04.2025 12:29)
- ну обычно там оказывается что-то стандартное типа "stddef.h". Свои
хедеры инклудить в другом своём хедере нехорошо. - POV(14.04.2025 12:30)
- Значит все пишущие библиотеки, и выкладывающие их на Гитхабе -
нехорошие люди :-) Посмотри как там все организовано. В общем - мне
кажется что я нарыл один неочевидный момент, о котором никто не
задумывается. - il-2(14.04.2025 12:35)
- Чтобы начали задумываться надо гард ставить в конце инклуда, тогда многие обнаружат у себя много интересного., ну и начнут задумываться - abivan(14.04.2025 15:25)
- Ну упрощая... POV(354 знак., 14.04.2025 12:38)
- Значит все пишущие библиотеки, и выкладывающие их на Гитхабе -
нехорошие люди :-) Посмотри как там все организовано. В общем - мне
кажется что я нарыл один неочевидный момент, о котором никто не
задумывается. - il-2(14.04.2025 12:35)
- ну обычно там оказывается что-то стандартное типа "stddef.h". Свои
хедеры инклудить в другом своём хедере нехорошо. - POV(14.04.2025 12:30)
- в сишнике инклудь.. POV(55 знак., 14.04.2025 12:28)
- Это как раз и есть нехороший вариант, хотя и рабочий. В
заголовочнике должно быть все необходимое. - il-2(14.04.2025 12:36)
- Чем меньше инклюдов в заголовочнике - тем лучше. Только то, что
нужно для объявления своих структур и аргументов функций (скажем,
stdint.h). - Eddy_Em(14.04.2025 17:08)
- Присоединяюсь! Отлить в золоте! - Nikolaj(15.04.2025 04:41)
- Люто плюсую! - Nikolay_Po(14.04.2025 18:41)
- Нет. Согласен с предыдущим оратором POV. Суй всё необходимое в реализацию - в файл *.c. В заголовочном
только то, что необходимо для пользования функционалом модуля,
того, что в .c файле. - Nikolay_Po(14.04.2025 13:44)
- я считаю, что инклуд должен компилироваться без ошибок. Но каждый
дрочит, как он хочет. - abivan(14.04.2025 15:29)
- Инклюд вообще не должен компилироваться. В нём не должно быть
определений. Только объявления. Можно, конечно, всю библиотеку
зафигачить в один .h. Но это совсем другое. - Nikolay_Po(14.04.2025 18:42)
- Есть header-only библиотеки, но да, в отдельном сишном файле нужно
объявить макрос инициализации. А еще можно true-inline функции в
header'ы складывать.. - Eddy_Em(14.04.2025 22:15)
- inline - это для маньяков. И для маньяков давно придумали получше:
LTO. - SciFi(14.04.2025 22:16)
- С LTO иногда непонятные глюки при сборке получаются. Но да, штука
очень полезная. Я даже под STM32 в release-сборке -flto добавляю. - Eddy_Em(14.04.2025 23:23)
- Дорос. Глюки при сборке с ЛТО - повод рефакторить код. - Nikolay_Po(14.04.2025 23:42)
- Это да: свою утилиту для работы с ПЗС/КМОП-светоприемниками я
добрую неделю "рефакторил" после того, как решил LTO добавить. Eddy_Em(179 знак., 15.04.2025 08:37)
- Был, например, случай, когда сломался код для SPI флешки.
Оказалось, нужно было добавить явную задержку на Chip Select. Эта
задержка получалась сама собой, пока LTO не было включено. Но
отлаживать такие вещи сложно, конечно. Дизассемблер и исходник
могут сильно разъехаться. - SciFi(15.04.2025 09:27)
- Хмм... Мой код не ломается. Я тщательно изучаю документы и проверяю сигналы осциллографом. Потом добавляю в код задержку принудительно, чтобы при максимальной скорости исполнения, необходимые интервалы были гарантированно выдержаны. Иногда ставлю задержки даже там, где код не успевает и так. Но ставлю. Как раз чтобы не получить неопределённого поведения аппаратуры при перекомпиляции другим компилятором с другими параметрами. - Nikolay_Po(15.04.2025 09:35)
- Был, например, случай, когда сломался код для SPI флешки.
Оказалось, нужно было добавить явную задержку на Chip Select. Эта
задержка получалась сама собой, пока LTO не было включено. Но
отлаживать такие вещи сложно, конечно. Дизассемблер и исходник
могут сильно разъехаться. - SciFi(15.04.2025 09:27)
- Это да: свою утилиту для работы с ПЗС/КМОП-светоприемниками я
добрую неделю "рефакторил" после того, как решил LTO добавить. Eddy_Em(179 знак., 15.04.2025 08:37)
- Дорос. Глюки при сборке с ЛТО - повод рефакторить код. - Nikolay_Po(14.04.2025 23:42)
- С LTO иногда непонятные глюки при сборке получаются. Но да, штука
очень полезная. Я даже под STM32 в release-сборке -flto добавляю. - Eddy_Em(14.04.2025 23:23)
- inline - это для маньяков. И для маньяков давно придумали получше:
LTO. - SciFi(14.04.2025 22:16)
- У меня нет определений в инклудах. Но инклуды все самодостаточны, и
могут быть скомпилированы без сообщений о том, что какой то тип,
который объявлен в другом инклуде не объявлен. - abivan(14.04.2025 19:16)
- Есть такой вариант. Да, хорошо делать так, чтобы для заявленного
библиотекой функционала, достаточно было включить её заголовок, без
ожиданий, что пользователь включит недостающее сам. Nikolay_Po(875 знак., 14.04.2025 23:52)
- Если пользователь не обращается к элементам структуры напрямую, только через функции-методы, то предоставлять поля структуры в хедере не обязательно. Только имя для связывания. Это позволяет спрятать все артефакты внешней либы от пользователя и соответственно не инклудить её хедеры. Без всяких приведений типа. =AlexD=(278 знак., 15.04.2025 09:46)
- Есть такой вариант. Да, хорошо делать так, чтобы для заявленного
библиотекой функционала, достаточно было включить её заголовок, без
ожиданий, что пользователь включит недостающее сам. Nikolay_Po(875 знак., 14.04.2025 23:52)
- Есть header-only библиотеки, но да, в отдельном сишном файле нужно
объявить макрос инициализации. А еще можно true-inline функции в
header'ы складывать.. - Eddy_Em(14.04.2025 22:15)
- Инклюд вообще не должен компилироваться. В нём не должно быть
определений. Только объявления. Можно, конечно, всю библиотеку
зафигачить в один .h. Но это совсем другое. - Nikolay_Po(14.04.2025 18:42)
- я считаю, что инклуд должен компилироваться без ошибок. Но каждый
дрочит, как он хочет. - abivan(14.04.2025 15:29)
- Нет. В заголовочнике только определения, которые ты хочешь кому-то
предоставить. Без этого хедер и нахер не нужен. - POV(14.04.2025 12:49)
- У нас уже разночтения начались. Все это верно. В хедере должен быть
только внешний интерфейс. В т.ч. и другие необходимые хедеры. Вот с
этим то и начинаются проблемы. il-2(225 знак., 14.04.2025 14:36)
- Не редко внешний интерфейс использует типы, прописанные в других хедерах. Тогда удобен инклуд в инклуде и не требуется соблюдать порядок инклудов в сишнике. - AlexBi(14.04.2025 15:34)
- Разбиение на мелкие сущности хорошо, перестановка - плохо. - Andreas(14.04.2025 14:39)
- У нас уже разночтения начались. Все это верно. В хедере должен быть
только внешний интерфейс. В т.ч. и другие необходимые хедеры. Вот с
этим то и начинаются проблемы. il-2(225 знак., 14.04.2025 14:36)
- Чем меньше инклюдов в заголовочнике - тем лучше. Только то, что
нужно для объявления своих структур и аргументов функций (скажем,
stdint.h). - Eddy_Em(14.04.2025 17:08)
- Это как раз и есть нехороший вариант, хотя и рабочий. В
заголовочнике должно быть все необходимое. - il-2(14.04.2025 12:36)
- И что, никаких рекурсий не будет? - SciFi(14.04.2025 12:25)