Отступ директив препроцессора в формате clang

Я работаю над проектом C ++, где я использую много #pragma omp, Я использую замечательный формат clang для аккуратности, но он всегда удаляет отступ для всех директив препроцессора. Есть ли способ изменить это поведение? Или есть другой инструмент форматирования, который более рекомендуется? Или мне вообще следует избегать использования этих инструментов?

19

Решение

Возможно, вы захотите просто исправить это самостоятельно и сделать запрос на удаление.

Это не так сложно, я однажды сделал такой же обыденный запрос. Код в формате clang довольно аккуратный. Clang-формат уже обрабатывает комментарии к коду так, как вы хотите, выравнивая их по окружающему коду (по крайней мере, у него есть возможность включить это), поэтому создание патча для одинаковой обработки некоторых директив PP должно быть простым.

Кроме того, вы можете просто написать патч самостоятельно и скомпилировать Clang из исходного кода с помощью дополнительной опции для использования в вашем проекте. Я также сделал это, прежде чем я решил отправить им патч.

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

5

Другие решения

Уже поздно, но это решение, которое вы ищете.
Он форматирует прагму вместе с блоком кода.
Вы можете использовать это, прежде чем они наконец поддержат отступ прагмы.

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
2

Начиная с версии 6.0, опция IndentPPDirectives может быть использован. Использование описано в этот обзор.

С помощью IndentPPDirectives: None результаты в:

#if FOO
#if BAR
#include <foo>
#endif
#endif

В то время как IndentPPDirectives: AfterHash дает:

#if FOO
#  if BAR
#    include <foo>
#  endif
#endif
2