如何以 clang 格式包装结构初始化程序?

Posted

技术标签:

【中文标题】如何以 clang 格式包装结构初始化程序?【英文标题】:How to wrap struct initializer in clang-format? 【发布时间】:2018-05-04 17:19:33 【问题描述】:

在运行 clang-format 之前以这个例子为例:

struct ApplicationState app_state = 
    .signal = 
        .use_crash_handler = true,
        .use_abort_handler = true,
    ,
    .exit_code_on_error = 
        .python = 0,
    
;

运行后,clang-format 应用如下:

struct ApplicationState app_state = .signal =
                                             
                                                     .use_crash_handler = true,
                                                     .use_abort_handler = true,
                                             ,
                                     .exit_code_on_error = 
                                             .python = 0,
                                     ;

有没有办法在大括号之后、结构成员之前添加换行符,这样它更像第一个示例而不是第二个示例?

【问题讨论】:

第一个版本是 before clang-format 运行。问题是如何保持这种格式并防止尴尬的第二个例子。 我不知道clang,但对于AStyle,我几乎可以肯定你可以在你的结构顶部添加一条评论来禁用自动格式化。尝试检查 clang 是否存在类似的东西。 @TimF,有。见Disabling Formatting on a Piece of Code @TimF,当然可以根据需要禁用格式化作为最后的手段。理想情况下,它的使用保持在最低限度,并且在 Q 中格式化结构是标准 C99,没有什么不寻常的。 好的,谢谢。也许我应该写一个功能请求来处理这个问题...... 【参考方案1】:

你最需要的是:

BreakBeforeBinaryOperators: All

您可以改为将整体样式设置为WebKit,因为这会将BreakBeforeBinaryOperators 设置为All

显然,clang-format 必须将. 视为二元运算符。我不确定它是否应该,但它似乎就是这样做的。


我使用 clang-format 6.0.0 对此进行了测试。据推测,较新的版本也可以正常工作,但我还没有测试过,所以我不能确定。

【讨论】:

【参考方案2】:

目前clang-format 没有有效的方法来控制这个(从 11.0 版开始)

虽然BreakBeforeBinaryOperators: All 确实强制换行(请参阅@eric-backus 的回答),但它也会影响许多其他地方的格式,与结构声明无关。

可以不过,只需使用尾随逗号即可解决此问题。


之前:

struct ApplicationState app_state = .signal =
                                             
                                                     .use_crash_handler = true,
                                                     .use_abort_handler = true,
                                             ,
                                     .exit_code_on_error = 
                                             .python = 0,
                                     ;

之后:


struct ApplicationState app_state = 
    .signal = 
        .use_crash_handler = true,
        .use_abort_handler = true,
    ,
    .exit_code_on_error = 
        .python = 0,
    ,
;
/*   ^ notice trailing comma on the second last line! */

【讨论】:

以上是关于如何以 clang 格式包装结构初始化程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 clang 格式控制数组初始值设定项的缩进?

clang-format 展开空初始化程序

clang 格式,数组初始化器

如何以 clang 格式对齐函数参数名称?

Clang 访问修饰符顺序和 decltype

Clang 格式:逗号前的空格?