1) #include с угловыми скобками для своего барахла. Я привык так никогда не делать, давным давно, и уже и не соображу, чем плохо. Ну и эмоции, переполняющие при виде всего этого, мешают
2) #include без путей. Вот везде в сорцах инклуды практически везде без путей — чисто имя файла без всего вот такого "somelib/impl/helpers/bla-bla-helper.h", а тупо #include "bla-bla-helper.h" или даже <bla-bla-helper.h>, но компилятору зато подсовываются все всевозможные пути поиска инклудов. Есть аргумент за то, чтобы ничего не менять — всё же собирается и работает. Но это какое-то гавно
3) порядок инклудов. Ведущие собаководы рекомендуют размещать "" перед <> и вообще располагать инклюды по мере специализации — более частные первыми — чтобы ловить ошибки, когда где-то чего-то не хватает, каждый хидер должен быть самодостаточным и всё такое.
Но у некоторых собаководов я встречал рекомендацию сортировать инклуды не только по "" и <>, но и по алфавиту, эта рекомендация несколько конфликтует с рекомендацией по ордеру по уровню специализации. Что думаете?
4) проект на CMake. Я бы понял, если бы кроссплатформа. Но наша часть чисто виндовая. Генерация с CMake'ом полчаса-час, а нафуа? Полчаса — это ещё без сборки. Потом на сборочном серваке собирается при помощи NMake+JOM, а на девелоперских машинах чтобы в студии поотлаживаться — отдельно надо генерить студийные проекты, и этого нет в репе, каждый извращается как умеет. Я бы перевел бы всю систему сборки чисто под MSVC/MSBuild, там не так страшно, как кажется, если не использовать автоматом генерённые MSVC-проекты, а руками править ихний xml, и быть в курсе, что там тоже есть инклуды. Я давно так живу, и это пиздаточень удобно. За недельку другую я бы всё сделал бы на MSVC/MSBuild зашибись без говна CMake'а. По этому пункту в принципе я и сам обоснований накидаю, но может кто что-то новое скажет
Такие дела
Re: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, пффф, Вы писали:
П>1) #include с угловыми скобками для своего барахла. Я привык так никогда не делать, давным давно, и уже и не соображу, чем плохо. Ну и эмоции, переполняющие при виде всего этого, мешают
Кавычки ищут в "текущей" директории (там, где сишник лежит), а потом уже по путю. Угловые скобки сразу ищут только по путю. Удобно использовать кавычки для "внутренних" ашников в "модуле" (в Си нет модулей, но разбивая проект на директории мы, фактически, их и делаем) а угловые скобки для ашников, которые "общие", "публичные".
П>2) #include без путей. Вот везде в сорцах инклуды практически везде без путей — чисто имя файла без всего вот такого "somelib/impl/helpers/bla-bla-helper.h", а тупо #include "bla-bla-helper.h" или даже <bla-bla-helper.h>, но компилятору зато подсовываются все всевозможные пути поиска инклудов. Есть аргумент за то, чтобы ничего не менять — всё же собирается и работает. Но это какое-то гавно
Если ашников очень много, пути позволяют структурировать пространство имен. Когда ашников пяток, пути ничего ценного не добавляют.
П>3) порядок инклудов. Ведущие собаководы рекомендуют размещать "" перед <> и вообще располагать инклюды по мере специализации — более частные первыми — чтобы ловить ошибки, когда где-то чего-то не хватает, каждый хидер должен быть самодостаточным и всё такое. П>Но у некоторых собаководов я встречал рекомендацию сортировать инклуды не только по "" и <>, но и по алфавиту, эта рекомендация несколько конфликтует с рекомендацией по ордеру по уровню специализации. Что думаете?
Я всегда слежу за тем, чтобы хотя бы где-то каждый ашник оказался первым — так проверяется его самодостаточность (способность компилироваться независимо от других ашников). Ашники как-то привязаны к сишникам. Логично договориться, что в тех сишниках, где содержится имплементация того, что в ашнике задекларированно, именно этот ашник идет первым.
Остальные я тупо сортирую по алфавиту. Так в них проще ориентироваться.
П>4) проект на CMake. Я бы понял, если бы кроссплатформа. Но наша часть чисто виндовая. Генерация с CMake'ом полчаса-час, а нафуа? Полчаса — это ещё без сборки. Потом на сборочном серваке собирается при помощи NMake+JOM, а на девелоперских машинах чтобы в студии поотлаживаться — отдельно надо генерить студийные проекты, и этого нет в репе, каждый извращается как умеет. Я бы перевел бы всю систему сборки чисто под MSVC/MSBuild, там не так страшно, как кажется, если не использовать автоматом генерённые MSVC-проекты, а руками править ихний xml, и быть в курсе, что там тоже есть инклуды. Я давно так живу, и это пиздаточень удобно. За недельку другую я бы всё сделал бы на MSVC/MSBuild зашибись без говна CMake'а. По этому пункту в принципе я и сам обоснований накидаю, но может кто что-то новое скажет
Это ты не победишь. CMake, как позорная инфекционная болезнь, проник повсюду. Хуже него только git.
Re: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, пффф, Вы писали:
П>1) #include с угловыми скобками для своего барахла. Я привык так никогда не делать, давным давно, и уже и не соображу, чем плохо. Ну и эмоции, переполняющие при виде всего этого, мешают
Ну обычно используют правило кавычки для внутренних зависимостей, а угловые скобки для внешних.
Новые внешние зависимости добавляют потенциально кучу проблем, поэтому важно придерживаться этого правила.
П>2) #include без путей. Вот везде в сорцах инклуды практически везде без путей — чисто имя файла без всего вот такого "somelib/impl/helpers/bla-bla-helper.h", а тупо #include "bla-bla-helper.h" или даже <bla-bla-helper.h>, но компилятору зато подсовываются все всевозможные пути поиска инклудов. Есть аргумент за то, чтобы ничего не менять — всё же собирается и работает. Но это какое-то гавно
Наоборот, очень важно не использовать или ограниченно использовать пути
в "больших" проектах. В "больших" проектах очень важно контролировать граф зависимостей
на уровне системы сборки, а не на уровне исходников. И не использование путей в include,
заставляет прописывать зависимости в системе сборки.
Например:
Без строчки (1) include foo.hpp выдаст ошибку, а вот если путь указать то работать будет,
но отсутствие явно прописанных зависимостей не позволяет ускорить сборку.
П>3) порядок инклудов. Ведущие собаководы рекомендуют размещать "" перед <> и вообще располагать инклюды по мере специализации — более частные первыми — чтобы ловить ошибки, когда где-то чего-то не хватает, каждый хидер должен быть самодостаточным и всё такое. П>Но у некоторых собаководов я встречал рекомендацию сортировать инклуды не только по "" и <>, но и по алфавиту, эта рекомендация несколько конфликтует с рекомендацией по ордеру по уровню специализации. Что думаете?
Ну по крайней мере следовать очевидному правилу, которые вы упоминули, в файл
реализации класса первым должен включаться файл с его описанием, чтобы проверить что заголовочный
файл самодостаточный, все остальное по желанию.
П>4) проект на CMake. Я бы понял, если бы кроссплатформа.
Ну у него есть много фишек, все возможные интеграции с разными инструментами от clang-tidy до ccache.
С кем нет интеграции можно использовать compile_commands.json который он умеет генерировать.
А то что он генерирует проекты кучу времени это очевидно баг. Для Qt и llvm он же не генерирует проекты
по несколько часов, максимум минут 10. Вряд ли у вас кодовая база больше.
И "Visual Studio" умеет же открывать CMakeLists.txt напрямую как проект,
так не будет быстрее, чем генерировать vcproj?
Re: Помогите обосновать некоторые проблемы и бонусы по их решению
1-3 — это какая-то мелочь. Если это самые большие "проблемы", то за вас можно только порадоваться. Но что-то мне подсказывает, что вы занимаетесь не тем, чем следовало бы заняться на проекте.
4 — тут важно понять мысль, что не все пользуются виндой, вижуальником и MSVC. Второе — некоторые проекты имеют свойство "перетекать" на другие платформы (поддержка Линукса и т.п.). Во всех этих случаях CMake будет только в плюс. Просто вы что-то делаете не так в вижле. И, как тут уже сказали, вижла давно умеет поднимать CMake-файлы из коробки, ничего там генерит не надо.
PS топик к управлению проектами не относится. Этот раздел форума не про вижуальне проекты (vcproj), а про проекты в смысле создания ПО (задачи, команда, ресурсы, менеджмент, вот это вот все).
Патриот здравого смысла
Re[2]: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, DiPaolo, Вы писали:
DP>1-3 — это какая-то мелочь. Если это самые большие "проблемы", то за вас можно только порадоваться. Но что-то мне подсказывает, что вы занимаетесь не тем, чем следовало бы заняться на проекте.
Возможно ты прав
DP>4 — тут важно понять мысль, что не все пользуются виндой, вижуальником и MSVC. Второе — некоторые проекты имеют свойство "перетекать" на другие платформы (поддержка Линукса и т.п.). Во всех этих случаях CMake будет только в плюс. Просто вы что-то делаете не так в вижле.
Все пользуются виндов и вижуалкой. Проект чисто виндовый, и по своей сути никогда не перетечет на другие платформы
DP>И, как тут уже сказали, вижла давно умеет поднимать CMake-файлы из коробки, ничего там генерит не надо.
Уметь то она умеет, но там но нафига они вообще нужны?
DP>PS топик к управлению проектами не относится. Этот раздел форума не про вижуальне проекты (vcproj), а про проекты в смысле создания ПО (задачи, команда, ресурсы, менеджмент, вот это вот все).
А топик и про проект в смысле создания ПО, в том числе
Re: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, пффф, Вы писали:
П>1) #include с угловыми скобками для своего барахла.
Внешние глобальные зависимости (SDK например) в угловых, внутренние в обычных.
П>2) #include без путей.
Не вижу проблемы если на диске всё правильно организовано.
П>3) порядок инклудов.
Первым обязательно идёт одноимённый с .cpp — тогда всегда точно знаешь что он самодостаточен.
Остальные в общем то пофигу. У меня они добавляются через VAX Add Include а не руками. Я иногда причёсываю, группируя однотипные вместе но это скорее по зову чуЙства прекрасного чем какой либо практической необходимости.
П>Я бы перевел бы всю систему сборки чисто под MSVC/MSBuild
+1
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, пффф, Вы писали:
П>1) #include с угловыми скобками для своего барахла. Я привык так никогда не делать, давным давно, и уже и не соображу, чем плохо. Ну и эмоции, переполняющие при виде всего этого, мешают
Большой проект разбит на модули. Каждый модуль живет в своей директории, что естественно. Есть публичные хидеры, в которых описан интерфейс модуля, и есть его внутренние хидеры, описывающие интерфейсы между его внутренними запчастями.
Логично отделить одно от другого, чтобы другим модулям были видны только публичные хидеры, но не внутренние.
Единственный способ это сделать — выделить публичные хидеры в отдельную директорию, добавить ее в include path и включать их через угловые скобки. А внутренние хидеры модуля, в самом модуле включать через кавычки.
П>2) #include без путей. Вот везде в сорцах инклуды практически везде без путей — чисто имя файла без всего вот такого "somelib/impl/helpers/bla-bla-helper.h", а тупо #include "bla-bla-helper.h" или даже <bla-bla-helper.h>, но компилятору зато подсовываются все всевозможные пути поиска инклудов. Есть аргумент за то, чтобы ничего не менять — всё же собирается и работает. Но это какое-то гавно
Пути в include — это способ разделения namespace имен заголовочных файлов. Чтобы добавляя очередной заголовочный файл, не надо было париться, есть такой уже, или нет.
Смысл они имеют только в иерархии публичных хидеров — тех, которые включаются через угловые скобки.
П>3) порядок инклудов. Ведущие собаководы рекомендуют размещать "" перед <> и вообще располагать инклюды по мере специализации — более частные первыми — чтобы ловить ошибки, когда где-то чего-то не хватает, каждый хидер должен быть самодостаточным и всё такое. П>Но у некоторых собаководов я встречал рекомендацию сортировать инклуды не только по "" и <>, но и по алфавиту, эта рекомендация несколько конфликтует с рекомендацией по ордеру по уровню специализации. Что думаете?
Я пишу по алфавиту и не парюсь. Отдельно группирую (1) системные хидеры (2) публичные хидеры проекта (3) внутренние хидеры модуля. В каком порядке, не важно, но консистентно в пределах проекта. Так, по крайней мере, легко проверить, что какой-то хидер по ошибке не подцепили два раза.
Чтобы убедиться в самодостаточности хидера, надо придумать правило, благодаря которому каждый хидер хоть где-то включается самым первым. Например, логично, что если есть хидер foo.h, то имплементация заявленного в нем живет в файле foo.c, и вот именно в этом файле этот хидер включается самым первым, до всех остальных.
Это не я, кстати придумал, а один мой очень умный коллега несколько работ назад.
П>4) проект на CMake. Я бы понял, если бы кроссплатформа. Но наша часть чисто виндовая. Генерация с CMake'ом полчаса-час, а нафуа? Полчаса — это ещё без сборки. Потом на сборочном серваке собирается при помощи NMake+JOM, а на девелоперских машинах чтобы в студии поотлаживаться — отдельно надо генерить студийные проекты, и этого нет в репе, каждый извращается как умеет. Я бы перевел бы всю систему сборки чисто под MSVC/MSBuild, там не так страшно, как кажется, если не использовать автоматом генерённые MSVC-проекты, а руками править ихний xml, и быть в курсе, что там тоже есть инклуды. Я давно так живу, и это пиздаточень удобно. За недельку другую я бы всё сделал бы на MSVC/MSBuild зашибись без говна CMake'а. По этому пункту в принципе я и сам обоснований накидаю, но может кто что-то новое скажет
CMake тошнотворен уже тем, что использует расширение .txt для своих служебных файлов. Ну какой, нахрен, .txt, в них же не "Понедельник начинается в субботу" Стругацких записан, а код на мутном языке программирования.
П>Такие дела
Угу.
Re[2]: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, DiPaolo, Вы писали:
DP>1-3 — это какая-то мелочь. Если это самые большие "проблемы", то за вас можно только порадоваться. Но что-то мне подсказывает, что вы занимаетесь не тем, чем следовало бы заняться на проекте.
Не мелочи. Если в организации проекта допустима неряшливость, это наводит на мысль, что и в коде допустима неряшливость, и в тестах, и в следовании спецификации. И что к внесению изменений можно относиться так: тесты проходит, ну и ладно.
Re[2]: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, Pzz, Вы писали:
Pzz>Чтобы убедиться в самодостаточности хидера, надо придумать правило, благодаря которому каждый хидер хоть где-то включается самым первым. Например, логично, что если есть хидер foo.h, то имплементация заявленного в нем живет в файле foo.c, и вот именно в этом файле этот хидер включается самым первым, до всех остальных. Pzz>Это не я, кстати придумал, а один мой очень умный коллега несколько работ назад.
Это правило ещё с прошлого века известно. Похоже народ его переоткрывает раз за разом.
Pzz>CMake тошнотворен уже тем, что использует расширение .txt для своих служебных файлов.
+1
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Помогите обосновать некоторые проблемы и бонусы по их решению
Pzz>CMake тошнотворен уже тем, что использует расширение .txt для своих служебных файлов. Ну какой, нахрен, .txt, в них же не "Понедельник начинается в субботу" Стругацких записан, а код на мутном языке программирования.
Пишем cmake-файл с удобным для нас расширением
пишем командный скрипт, в котором копируем cmake-файл с нужным расширением, запускаем cmake и удаляем копию cmake-файла
Нормально вроде получится
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Помогите обосновать некоторые проблемы и бонусы по их ре
Здравствуйте, пффф, Вы писали:
П>1) #include с угловыми скобками для своего барахла. Я привык так никогда не делать, давным давно, и уже и не соображу, чем плохо.
вроде ничем не плохо. Можно просто по ошибке подключить локальный файл вместо stl. Ну будет ошибка компиляции, ничего страшного случиться вроде не должно.
П>2) #include без путей.
единственный бонус вижу в том, что если включаемый файл куда-то переедет, не надо будет менять по коду все include.
П>3) порядок инклудов. ... Что думаете?
думаю, что фигня. Их зачастую не так уж много, чтобы почти сразу окинуть глазом все. А если много, то видимо надо разбить файл на несколько, или уменьшить связанность.
П>4) проект на CMake. Я бы понял, если бы кроссплатформа. Но наша часть чисто виндовая.
тогда используйте студию и каждый день благодарите всевышнего за это
Здравствуйте, sergii.p, Вы писали:
П>>2) #include без путей. SP>единственный бонус вижу в том, что если включаемый файл куда-то переедет, не надо будет менять по коду все include.
Это если файл, а не каталог. Если вдруг надо выделить подпроект в отдельный проект, то правка затронет множество файлов... Короче: никаких путей в инклюдах — исходники не должны зависеть от файловой структуры.
И каждый день — без права на ошибку...
Re: Вопрос к высказавшимся за то, что одноимённый инклудник должен идти первым
Здравствуйте, Conductor, Вы писали:
C>Вопрос к высказавшимся за то, что одноимённый инклудник должен идти первым.
C>Коллеги, я правильно понял, что precompiled headers вы не используете?
На ручнике нет, при правильной организации include (каждый header первым включает master header в котором собраны основные FW + SDK includes) нормальный промышленный компилер разруливает это всё сам.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Вопрос к высказавшимся за то, что одноимённый инклудник должен идти первы
Здравствуйте, Conductor, Вы писали:
C>Вопрос к высказавшимся за то, что одноимённый инклудник должен идти первым.
C>Коллеги, я правильно понял, что precompiled headers вы не используете?
Я использую. clang/gcc не накладывают никаких ограничений на то как должен
писать код программист при использовании "precompiled headers".
Можно передавать "-include" параметр gcc/clang, можно рядом с каждым заголовчным
файлом положить ".pch" / ".gch" файл, и gcc/clang если их увидят, будут использовать их,
а не парсить исходники.
Re: Помогите обосновать некоторые проблемы и бонусы по их решению
Здравствуйте, пффф, Вы писали:
П>Но у некоторых собаководов я встречал рекомендацию сортировать инклуды ... по алфавиту, эта рекомендация несколько конфликтует с рекомендацией по ордеру по уровню специализации. Что думаете?
Я думаю, если тут есть рациональное зерно, то оно в следующем. Такая рекомендация как миксер перемешивает инклуды и заставляет проявляться ситуации, когда от порядка инклудов не должно ничего зависеть, но что-то зависит.
По причинам, озвученным выше, я всегда придерживался позиции, что рекомендовать порядок инклудов не надо, но рекомендация сортировать по какому-нибудь левому признаку типа алфавита — ещё лучше. А ещё лучше — вообще каждый раз рандомизировать. Только вот некрасиво это всё — мне кажется красивее группировать по задачам, для решения которых нужны инклуды.