Как запретить clang-format добавлять одну точку с запятой в новую строку?

У меня есть эта строка кода на С++

while (fread(pixel_array++, sizeof(byte), 3, fp));

но когда я использую clang-format, он разбивает точку с запятой и добавляет ее в новую строку

while (fread(pixel_array++, sizeof(byte), 3, fp))
    ;

Мне не нравится такой стиль, и я просто предпочитаю сохранить оригинальный.

Как мне изменить конфигурацию Clang-формата? Спасибо.


person KaitoHH    schedule 04.04.2017    source источник


Ответы (3)


clang-format 5.0 в настоящее время не распознает этот тип цикла. К сожалению, начиная с версии 5 clang-format, вы не получите настройку, которая делает то, что вам нужно.

Поиск параметров стиля формата Clang, ближайший к Я обнаружил, что это AllowShortLoopsOnASingleLine: true, но этот параметр не распознает условие цикла как тело цикла.

Пока clang-format не распознает такие циклы, я бы пометил ваш код // clang-format off, а затем // clang-format on вокруг вашего блока кода.

person Unglued    schedule 18.11.2017
comment
Большое спасибо! Это компромиссный способ сделать это. - person KaitoHH; 21.11.2017

По-видимому, это невозможно, но обходным путем может быть замена точки с запятой пустым блоком. Если установлены оба AllowShortLoopsOnASingleLine и AllowShortBlocksOnASingleLine, то он будет отформатирован как

while (fread(pixel_array++, sizeof(byte), 3, fp)) {}
person dpi    schedule 16.06.2019

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

for(;;)
{
    auto const read_bytes_count{fread(pixel_array, sizeof(byte), 3, fp)};
    if((sizeof(byte) * 3) != read_bytes_count)
    {
        // probably deal with error handling...
        break;
    }
    ++pixel_array;
}
person dodo951    schedule 04.04.2017
comment
Это не отвечает на мой вопрос о конфигурации clang-формата. Кроме того, fread вернет 0, когда fp достигнет EOF, и программа выйдет из цикла while, но суть не в этом. - person KaitoHH; 05.04.2017
comment
fread может возвращать любое значение, меньшее или равное запрошенному количеству байтов. Если он возвращает 1 или 2, вы останетесь в неинициализированных данных, и даже если он вернет 0, это не обязательно означает, что был достигнут EOF. Поэтому проверка ошибок обязательна. Я действительно не ответил о clang-формате, но это потому, что у вас действительно нет проблем с этим. Ваша проблема - пустое тело цикла. - person dodo951; 05.04.2017
comment
Я действительно не думаю, что в моем коде существует какая-либо проблема. Я уже получил размер файла в предыдущем коде, а также правильно инициализировал свой массив. То, как я читаю такой файл, не связано с особыми потребностями. Это всего лишь небольшая часть моего кода, вы можете посетить эту ссылку чтобы увидеть весь мой код, если вам интересно. Напоследок хотелось бы еще узнать способ настройки clang-формата. - person KaitoHH; 06.04.2017
comment
Какую версию clang-формата вы используете? Пробую код в clang-формате 4.0.1. А clang-format сохраняет ваш код неизменным. - person appleleaf; 29.06.2017