WedX - журнал о программировании и компьютерных науках

clang-format и lttng TP_ENUM_VALUES/ctf_enum_value

При использовании формата Clang для форматирования файла с определениями трассировки LTTNG настройки по умолчанию делают отступ ctf_enum_value довольно уродливым:

TRACEPOINT_ENUM(com_fafa,
                fafa_enum,
                TP_ENUM_VALUES(ctf_enum_value("AAA", AAA)
                                   ctf_enum_value("BBB", BBB)
                                       ctf_enum_value("CCC", CCC)))

Есть ли возможность получить clang-format для выравнивания значений ctf_enum_values, как показано ниже?

TRACEPOINT_ENUM(com_fafa,
                fafa_enum,
                TP_ENUM_VALUES(ctf_enum_value("AAA", AAA)
                               ctf_enum_value("BBB", BBB)
                               ctf_enum_value("CCC", CCC)))

Я предполагаю, что проблема в том, что в этих списках нет запятых, что, вероятно, не нравится clang-формату...

Использование «ContinuationIndentWidth: 0», как указано в ответе ниже, в некоторых случаях работает хорошо, но в других это ухудшит ситуацию, например, вы можете получить это:

TRACEPOINT_EVENT(
com_fafa,
L_ERROR_fafa,
TP_ARGS(const enum fafa_type, e_code_, const int, msg_type_, const char*, file_line_),
TP_FIELDS(ctf_string(file_line, file_line_) ctf_integer(int, e_code, e_code_) ctf_integer(int, msg_type, msg_type_)
          ctf_integer_nowrite(int, u_trace_id, -1) ctf_string_nowrite(e_msg, "")))
23.03.2018

Ответы:


1

Начиная с LTTng 2.10.1, ctf_enum_value() переводится в это:

#define ctf_enum_value(_string, _value)                                 \
        {                                                               \
                .start = {                                              \
                        .value = lttng_is_signed_type(__typeof__(_value)) ? \
                                (long long) (_value) : (_value),        \
                        .signedness = lttng_is_signed_type(__typeof__(_value)), \
                },                                                      \
                .end = {                                                \
                        .value = lttng_is_signed_type(__typeof__(_value)) ? \
                                (long long) (_value) : (_value),        \
                        .signedness = lttng_is_signed_type(__typeof__(_value)), \
                },                                                      \
                .string = (_string),                                    \
        },

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

Я предполагаю, что макросы - проблема для ClangFormat, потому что они не обязательно могут быть проанализированы как C/C++. У вас могут возникнуть дополнительные проблемы с другими макросами, и для некоторых из них вам придется выполнить ручное форматирование.

Тем временем, моим решением было бы установить для параметра ClangFormat ContinuationIndentWidth значение 0, для пример:

clang-format -style '{BasedOnStyle: llvm, ContinuationIndentWidth: 0}' my-tp.h

Учитывая ваш ввод, эта команда печатает:

TRACEPOINT_ENUM(com_fafa, fafa_enum,
                TP_ENUM_VALUES(ctf_enum_value("AAA", AAA)
                               ctf_enum_value("BBB", BBB)
                               ctf_enum_value("CCC", CCC)))
23.03.2018
  • Это работает для некоторых записей. Но для других становится еще хуже. Я обновлю вопрос с примером. 26.03.2018
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]