因此,弄乱了clang格式代码并进行了一些修补,这是我的两分钱:
Clang格式基于
使用clang-format解析AST,基本上消除了所有空白
将令牌序列分解为“展开的行”,就像“逻辑”代码行
应用规则/配置信息有时将“展开的行”分成较小的单元
用新的空格/缩进再次将其吐出
要尊重原始的白皮书并不容易,在您第一次解析代码时就会被扔掉。
您可以通过以下方式最轻松地控制将换行符放置在何处
设置列限制
使用“ bin pack参数”选项
设置各种中断的惩罚-在函数的返回类型之后中断,在第一个调用参数之前中断,在字符串文字之前中断,在注释之前中断...
在行末放置注释(clang格式不能删除注释,因此必须拆分行)
使用clang-format off / on指令
这是您可以尝试的一件事:
std::vector<:string> get_vec()
{
return std::vector<:string> { //
"this is a test", //
"some of the lines are longer", //
"than other, but I would like", //
"to keep them on separate lines" //
};
}
与clang-format相比,它的优点在于,如果以后更改制表符宽度或其他选项,这些代码行仍将获得那些格式更改,因此您无需手动进入// clang-format off区域进行修复。 但是,YMMV还是有点骇人听闻。
最终,clang-format就是在整个代码库上强加统一的格式,以确保所有字符串文字在程序中的任何地方都以相同的样式进行格式化。 如果您想对换行决策进行微观控制,那么这实际上并不是该工具的实质,因此您必须执行禁用它的操作。
有时这可能会令人沮丧。 当您想对数组进行处理并使列对齐或进行某些操作时,例如,这是来自lua C api的一些自然代码:
static luaL_Reg const methods[] = {
{"matches", &dispatch::intf_match_unit},
{"to_recall", &dispatch::intf_put_recall_unit},
{"to_map", &dispatch::intf_put_unit},
{"erase", &dispatch::intf_erase_unit},
{"clone", intf_copy_unit},
{"extract", &dispatch::intf_extract_unit},
{"advance", intf_advance_unit},
};
当clang-format在其上运行时,通常不会对齐右列,而是在逗号后将其固定放置一定的空格,并且afaik对此无能为力。
或者,如果您有用于OpenGL的4 x 4矩阵:
constexpr float shadow_skew_hardcoded[16] =
{ 1.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
如果让clang-format运行这样的事情,那只会破坏它们,而afaik没有简单的方法可以使它们很好地格式化,因此您只需要借助“大量琐碎的注释” hack或使用 当您遇到类似这种情况时,请关闭clang格式。 这些只是该工具的固有限制。 如果您不愿意做那样的事情,那么它可能不是您的工具。