clang-format and lttng TP_ENUM_VALUES/ctf_enum_value



当使用 Clang-format 格式化具有 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 格式来对齐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, "")))

从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)))

相关内容

  • 没有找到相关文章

最新更新