LINUX.ORG.RU

Ищу проекты на C/C++ с определённым форматированием

 , , ,


2

6

Существует невероятное количество вариантов стиля кодирования. Среди них есть один, в котором для отступов используется четыре пробела, а открывающие фигурные скобки в управляющих конструкциях находятся на той же строке, что и условие. Для однострочных условий получается неплохо:

if (shortcondition) {
    some_code(1);
    some_code(2);
}

но когда условия становится длинными, расползаются на несколько строк, становится трудно различать, где кончается условие и начинается код:

if (longcondition + 1 + 2 + 3 +
    continuation + 4 + 5 + 6) {
    some_code(1);
    some_code(2);
}

Одно из решений, которое мне понравилось — переносить открывающую скобку на новую строку:

if (longcondition + 1 + 2 + 3 +
    continuation + 4 + 5 + 6)
{
    some_code(1);
    some_code(2);
}

При этом в коротких условиях она остаётся на одной строке с условием. Такой подход я с некоторых пор стал использовать в своём коде. Но мои проекты небольшие как по объёму, так и по числу разработчиков.

Теперь собственно, проблема. Мне нужно найти достаточного размера открытые проекты (несколько десятков разработчиков), в которых используется такой стиль. У проекта должен быть документ с описанием стиля кодирования.

(Найти такой проект — одно из условий, которое желательно выполнить, чтобы включить новую опцию в clang-format.)

★★★★★

Это фактически Qt Coding Style. Только на длинных условиях они не переносят.

RazrFalcon ★★★★★ ()

но когда условия становится длинными, расползаются на несколько строк, становится трудно различать, где кончается условие и начинается код

Для этого включают перенос бинарных операторов при разрыве выражения.

Правда, обычно делают это убого, без отступа в предыдущих строках выражения, которое разрывается. Получается рвань вида

if (a > 0
    && b < 0) {
вместо
if (   a > 0
    && b < 0) {

А что касается clang-format: его ещё пилить и пилить. По сравнению с тюнингом форматирования в некоторых IDE, clang-format недалеко ушёл от astyle, почти такой же дубовый.

utf8nowhere ★★ ()

Если б ты использовал 2 пробела для отступа, то такой бы проблемы не воникло:

if (longcondition + 1 + 2 + 3 +
    continuation + 4 + 5 + 6) {
  some_code(1);
  some_code(2);
}

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

Если бы он использовал табы для отступов, а пробелы для выравнивания, то проблемы отличить отступ от выравнивания не возникло бы.

utf8nowhere ★★ ()
Ответ на: комментарий от utf8nowhere

Без понимания того, что является макросом, а что — просто функцией/символом, все эти форматтеры для сишки просто бесполезны. clang-format думает, что в

VECTOR_OF(char*) v;
(char*) — это каст. Не говоря уже о всякой чёрной магии типа макросов, принимающих код как аргумент.

anonymous ()
Ответ на: комментарий от utf8nowhere

clang-format единственный ставит пробелы после открывающей и до закрывающей скобки.

У astyle я такого тупо не нашёл.

a1batross ★★★★★ ()
Ответ на: комментарий от Kroz

Если б ты использовал 2 пробела для отступа, то такой бы проблемы не возникло

Формально — да, в самих LLVM и Clang так и делают. Но даже в коде, где отступы табами, по восемь мест, как utf8nowhere предлагал, я всё равно прошу скобку на отдельную строку ставить. Мне так проще код читать, да и некоторым другим тоже.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

отступы табами, по восемь мест, как utf8nowhere предлагал

Не ври, я не предлагал никаких «по восемь мест».

utf8nowhere ★★ ()
Ответ на: комментарий от a1batross

clang-format единственный

Не единственный.

У astyle я такого тупо не нашёл.

Это преимущество clang-format включено в «недалеко ушёл от astyle».

utf8nowhere ★★ ()
Ответ на: комментарий от utf8nowhere

А у кого ещё такое есть?

Я заметил, что нужное мне в только самых свежих версиях.

a1batross ★★★★★ ()
Ответ на: комментарий от utf8nowhere

Если бы он использовал табы для отступов, а пробелы для выравнивания, то проблемы отличить отступ от выравнивания не возникло бы.

Плюсую.
Но таки размер табы лучше всего делать 2 символа. ИМХО, но данный пример показателен.

Kroz ★★★★★ ()
Ответ на: комментарий от a1batross

А у кого ещё такое есть?

В некоторых коммерческих IDE. Плюс ещё куча тонких настроек, вроде отдельных опций форматирования блоков лямбд и проч.

utf8nowhere ★★ ()
Ответ на: комментарий от utf8nowhere

Я лично только в VS встречал. Притом именно так, как мне надо. Что неудивительно, весь код до меня писался в MSVC6.

a1batross ★★★★★ ()
Ответ на: комментарий от i-rinat

Мне так проще код читать, да и некоторым другим тоже.

Это дело привычки, поверь. Лично меня скобки на отдельной строке раздражают, ибо отбирают драгоценне место по вертикали. Я допускаю их только как начало/конец функций.

Я когда-то использовал 4 пробела для отступа. Но однажды мне попался код такой вложенности, что строка начиналась после половины эерана. После этого я перешел на 2 пробела и не жалею. Правда это было еще во времена дисплеев в 80 символов шириной...

Да, про табы вверху правильно заметили.

А вообще я сам пока до конца не рафинировал свои собственные правила форматирования. Но всё больше склоняюсь к тому, что они должны быть из тех, которые поддерживабтся «автоматическикми форматтерами»; пока тему не сильно разрабатывал, но видел такой в Eclipse. Рекомендую подумать над этой мыслью...

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

Я когда-то использовал 4 пробела для отступа. Но однажды мне попался код такой вложенности, что строка начиналась после половины эерана.

Под всех чудаков не подстроишься, а приведенный пример кода вообще не заслуживает быть образцом для подражания.

m0rph ★★★★★ ()
Ответ на: комментарий от a1batross

Неа. Дядя миша вроде от штудии толькь компилятор юзал.

mittorn ★★★★★ ()
Ответ на: комментарий от Kroz

Но таки размер табы лучше всего делать 2 символа.

Хоть я и не люблю это выражение как «размер таба» и утверждаю, что 1 таб всегда 1 символ, но иногда приходится признавать, что «размер таба» иногда имеет значение.
Так вот, про «размер таба». 2 символа неудобно тем, что при закомментировании строки вставкой двух слешей в начале она едет. При «размере таба» больше двух символов такого не происходит.

utf8nowhere ★★ ()
Ответ на: комментарий от m0rph

Под всех чудаков не подстроишься

Поэтому делать оступы нужно табом, а там уже каждый чудак выставит себе его (таба) размеры.

а приведенный пример кода вообще не заслуживает быть образцом для подражания

Совершенно не заслуживает. Но такое быват, и это нужно учитывать.

Kroz ★★★★★ ()
Ответ на: комментарий от utf8nowhere

Так вот, про «размер таба». 2 символа неудобно тем, что при закомментировании строки вставкой двух слешей в начале она едет. При «размере таба» больше двух символов такого не происходит.

Интересная мысль в том плане, что она логична, но лично я никогда не испытывал дискомфорта по этому поводу, так как любой вменяемый редактор по-особому форматирует комментарии, и глаз уже научился игнорировать эти строки.

Короче: дело привычки.

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

Я не навязываю подобное решение никому, кто в этот тред зайдёт. Просто хочу иметь в ванильном clang-format настройку, которая делает мне хорошо, но не ломает жизнь другим.

Это дело привычки, поверь.

Все подобные заявления предполагают, что все кодеры придерживаются одного стиля. Это не так. Я видел несколько вариантов оформления, о которых и помыслить не мог.

про табы вверху правильно заметили

Возможно, ты ещё не видел код, в котором вторую и последующие строки условия отбивают табами. Из-за этого всё равно код с условием сливается.

Установленный стиль уже есть, я его не могу менять по велению левой пятки.

свои собственные правила форматирования

Когда пишешь код один, вообще проблем нет. И автоформаттеры не нужны.

i-rinat ★★★★★ ()
Ответ на: комментарий от Kroz

Я когда-то использовал 4 пробела для отступа. Но однажды мне попался код такой вложенности, что строка начиналась после половины эерана. После этого я перешел на 2 пробела и не жалею. Правда это было еще во времена дисплеев в 80 символов шириной...

как-то смотрел sqldiff, там используется очень компактный синтаксис:

while( SQLITE_ROW==sqlite3_step(pStmt) ){
  if( truePk && (iPKey = sqlite3_column_int(pStmt,5))>0 ){
    az[iPKey-1] = safeId((char*)sqlite3_column_text(pStmt,1));
  }else{
В начале думал что за хрень? Смешивалось в кучу всё. А когда захотел разобраться чуток в коде, то заметил что компактность мне на руку. Функции получаются мелкие, влезают по 3-4 в экран, если побольше - по 2, если совсем большая - 1. Ну, с исключениями. Решил переписать «нормально» — и тут я просветлел.

P.S. Сейчас если пишу, то в GNU-стиле.

P.P.S. Монитор 24", если что. 1920х1080. Два. Дело не в нехватке места.

chinarulezz ★★★★★ ()
Последнее исправление: chinarulezz (всего исправлений: 1)
Ответ на: комментарий от a1batross

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

utf8nowhere ★★ ()
Ответ на: комментарий от a1batross

В Uncrustify можно настроить и это, и ещё кучу всего, но сама настройка не для слабонервных.

ABW ★★★★ ()
Ответ на: комментарий от ABW

https://github.com/uncrustify/uncrustify/blob/master/documentation/htdocs/configuration.txt

utf8_bom                                          { Ignore, Add, Remove, Force }
  Control what to do with the UTF-8 BOM (recommend 'remove')

indent_with_tabs                                  Number
  How to use tabs when indenting code
  0=spaces only
  1=indent with tabs to brace level, align with spaces (default)

Адекватов видно сразу. Стоит заплатить внимание к софтине.

utf8nowhere ★★ ()

А вот, видимо, то, что нужно ОП-у

nl_multi_line_cond                                { False, True }
  Add a newline between ')' and '{' if the ')' is on a different line than the if/for/etc.
  Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and nl_catch_brace.

Так что бросай эту шланговскую унылую поделку и бери готовый мощный инструмент.

utf8nowhere ★★ ()
Ответ на: комментарий от utf8nowhere

готовый мощный инструмент

Гуглится багрепорт на эту опцию. У репортера она не работала. Закрыт репорт эпично — мол, тебе нужно nl_if_brace=force. Не тестил ещё, но я подозреваю, что это не совсем то, что мне нужно. Хотя полтора года прошло, нужно тестить.

Ты вроде о его существовании только недавно узнал, а уже считаешь его мощным инструментом?

шланговскую унылую поделку

Сдаётся мне, что твоё мнение предвзято. «Всё, что угодно, кроме clang.»

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Гуглится багрепорт на эту опцию.

УМВР http://i.imgur.com/v9Of8cX.png

Сдаётся мне, что твоё мнение предвзято.

Чисто практические соображения. clang-format, как я писал, недалеко ушёл от astyle. И ещё нескоро дойдёт до уровня uncrustify.

utf8nowhere ★★ ()

У нас в гайдлайнс сказано четко - открывающаяся и закрывающаяся фигурные скобки должны быть всегда на отдельных строках.

И, да, пробел после if не нужен. (И проблема сама собой уйдет)

if(longcondition + 1 + 2 + 3 +
   continuation + 4 + 5 + 6) {
    some_code(1);
    some_code(2);
}

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от invy

Еще, переносить лучше оператор на новую строку, а не переменную.

if (longcondition + 1 + 2 + 3
    + continuation + 4 + 5 + 6) {
    some_code(1);
    some_code(2);
}
invy ★★★★★ ()
auto cond = longcondition + 1 + 2 + 3 + continuation + 4 + 5 + 6;
if (cond) {
    some_code(1);
    some_code(2);
}

?

fluorite ★★★★★ ()

Эту проблему можно решить элементарно переносом оператора в условии на новую строку.

ya-betmen ★★★★★ ()
if (longcondition + 1 + 2 + 3 +
    continuation + 4 + 5 + 6) {    
    
    some_code(1);
    some_code(2);
}
anonymous ()
Ответ на: комментарий от invy

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

i-rinat ★★★★★ ()
Ответ на: комментарий от mittorn

Не, там у него в архиве были проектные файлики от студии шестой.

Да и где он код писал, если не в студии?

EXL ★★★★★ ()

Одно из решений, которое мне понравилось — переносить открывающую скобку на новую строку

Это правильно, все хорошие так делают, я например :)

Это фактически Qt Coding Style. Только на длинных условиях они не переносят.

В их примерах я такого не вижу..

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от fluorite

Я сомневаюсь, что есть софт, который может преобразовать существующий код, выделив условия в отдельные переменные с внятным названием. Вся суть использования автоматизации — уйти от рутины при проверке.

i-rinat ★★★★★ ()

я делаю точно так же. очень люблю синтаксис k&r, но в некоторых случаях приходится идти на такие компромиссы.

vvviperrr ★★★★★ ()
Ответ на: комментарий от utf8nowhere

В некоторых коммерческих IDE

Имя, сестра, имя!

anonymous ()
Ответ на: комментарий от EXL

он упоминал, что собирал через msdev. А это утилита для сборки именно проектов студии. Т.е ему студия надоела и он использовал что-то другое.

mittorn ★★★★★ ()
Ответ на: комментарий от anonymous

Вот так, да. Лучше просто вставлять пустую строчку, чем придумывать исключение к стилю расстановки фигурных скобок.

intelfx ★★★★★ ()
Ответ на: комментарий от fluorite

Всегда так делаю :)

Только const перед auto.

Stil ★★★★★ ()
Ответ на: комментарий от intelfx

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

Читал-читал, так и не понял, сарказм это, или на полном серьёзе. Если второе, то, допустим, я могу это принять как часть стиля. Как мне прошивку у всех остальных обновить?

У тебя, как и у многих других, она не сама обновляется — ты предлагаешь сменить стиль вместо поддерживания текущего. Представь, что вас таких с пару десятков. И у каждого — своё любимое форматирование.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Ты тоже предлагаешь новый стиль вместо обычного Attach.

А вообще-то нет, я ничего не предлагаю. Я лишь сказал, что стиль, предложенный анонимусом, мне нравится больше, чем стиль, предложенный тобой.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)

Продолжение строки — 2 отступа. Применяется не только для условий, а для любых длинных строк, не вмещающихся в экран.

if (longcondition + 1 + 2 + 3 +
        continuation + 4 + 5 + 6) {
    some_code(1);
    some_code(2);
}
Dendy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.