首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clang-format和lttng TP_ENUM_VALUES/ctf_enum_value

clang-format和lttng TP_ENUM_VALUES/ctf_enum_value
EN

Stack Overflow用户
提问于 2018-03-23 19:43:54
回答 1查看 113关注 0票数 0

当使用Clang-format格式化带有LTTNG跟踪定义的文件时,默认设置使得ctf_enum_value缩进非常难看:

代码语言:javascript
复制
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?

代码语言:javascript
复制
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“在某些情况下工作得很好,但对于其他情况,它会使情况变得更糟,例如,你可能会得到这样的结果:

代码语言:javascript
复制
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, "")))
EN

回答 1

Stack Overflow用户

发布于 2018-03-23 22:12:28

从LTTng 2.10.1开始,ctf_enum_value()被转换为this

代码语言:javascript
复制
#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,例如:

代码语言:javascript
复制
clang-format -style '{BasedOnStyle: llvm, ContinuationIndentWidth: 0}' my-tp.h

根据您的输入,此命令将打印:

代码语言:javascript
复制
TRACEPOINT_ENUM(com_fafa, fafa_enum,
                TP_ENUM_VALUES(ctf_enum_value("AAA", AAA)
                               ctf_enum_value("BBB", BBB)
                               ctf_enum_value("CCC", CCC)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49448921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档