Как я могу сделать отступ прагмы С++, используя clang-format?

Я использую vim-autoformat, который использует clang-format в качестве внешнего средства форматирования.

Кажется, что clang-format не будет отступать от C++ #pragma. Например:

#include <omp.h>
#include <cstdio>
int main()
{
#pragma omp parallel for
    for (int i = 0; i < 10; ++i)
    {
        puts("demo");
    }
    return 0;
}

Я хотел бы отформатировать его в:

#include <omp.h>
#include <cstdio>
int main()
{
    #pragma omp parallel for
    for (int i = 0; i < 10; ++i)
    {
        puts("demo");
    }
    return 0;
}

Я проверил clangformat, но не нашел, какой вариант использовать.


person Alaya    schedule 11.07.2015    source источник
comment
Может быть, потому что традиционно директивы препроцессора должны начинаться с первого столбца строки?   -  person Some programmer dude    schedule 11.07.2015
comment
Соответствующий отчет об ошибке.   -  person rettichschnidi    schedule 19.06.2016
comment
Нашли ли вы какое-нибудь решение (иначе потом повторный разбор)?   -  person Tom de Geus    schedule 05.02.2020
comment
Обновление от января 2021 г. На основании моего исследования кажется, что clang-format 12 планирует ввести поле под названием IndentPragmas, которое решает эту проблему. Однако в двоичном файле clang-format (версия 12), который я собираю, эта опция не реализована. Надеюсь, что это обеспечивает некоторые обновления.   -  person aafulei    schedule 19.01.2021


Ответы (2)


Было поздно, но это решение, которое вы ищете. Он форматирует прагму вместе с блоком кода.

https://github.com/MedicineYeh/p-clang-format

Основная концепция заключается в замене строки, чтобы средство форматирования использовало «правильные» правила для этих прагм. Мотивирующий пример таков.

# Replace "#pragma omp" by "//#pragma omp"
sed -i 's/#pragma omp/\/\/#pragma omp/g' ./main.c
# Do format
clang-format ./main.c
# Replace "// *#pragma omp" by "#pragma omp"
sed -i 's/\/\/ *#pragma omp/#pragma omp/g' ./main.c
person Medicine Yeh    schedule 18.07.2017
comment
Спасибо за Ваш ответ. Пожалуйста, включите соответствующие части кода в свой ответ. - person perigon; 18.07.2017

Это даже немного позже, но clang-format, наконец, планирует сделать обходные пути ненужными. https://reviews.llvm.org/D92753 вводит логический переключатель IndentPragmas, позволяющий устанавливать отступы прагм такой же, как окружающий его код.

person Mingye Wang    schedule 03.05.2021