Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用叮当格式保持标签缩进?_C_Clang Format - Fatal编程技术网

C 如何使用叮当格式保持标签缩进?

C 如何使用叮当格式保持标签缩进?,c,clang-format,C,Clang Format,叮当格式删除goto标签上的缩进。不建议使用//clangformat off。如何配置clang格式以不更改配置文件中标签的缩进 所需输出 标签缩进以匹配函数中的代码。他们应该留在那个缩进里 int new_foo(foo **bar) { *bar = malloc(sizeof(foo)); if ( !bar ) { goto failed; } goto done; failed: { return -1; } done: retur

叮当格式删除
goto
标签上的缩进。不建议使用
//clangformat off
。如何配置clang格式以不更改配置文件中标签的缩进

所需输出

标签缩进以匹配函数中的代码。他们应该留在那个缩进里

int new_foo(foo **bar) {

  *bar = malloc(sizeof(foo));
  if ( !bar ) {
    goto failed;
  }

  goto done;
  failed: {
    return -1;
  }
  done:
  return 1;
}
实际产出

这就是clang格式实际产生的结果。这是不可取的,因为它会破坏压痕折叠

int new_foo(foo **bar) {

  *bar = malloc(sizeof(foo));
  if ( !bar ) {
    goto failed;
  }

  goto done;
failed: {
  return -1;
}
done:
  return 1;
}
更新

.clang格式
配置中使用
IndentGotoLabels:false
(或
true
)时,这就是结果。注意
完成:
失败:
标签向左移动

int new_foo(foo **bar) {
  *bar = malloc(sizeof(foo));
  if (!bar) {
    goto failed;
  }

  goto done;
failed : { return -1; }
done:
  return 1;
}
.clang格式的内容

IndentGotoLabels: false

命令为
cat test.cc | clang format
,并在存在
.clang format
的同一目录中运行。

编辑:我最初的答案是错误的

看起来,无论如何设置缩进标签,标签都不会缩进到与代码相同的级别。考虑下面的代码片段:

int new_foo()
{
{
int*p=malloc(sizeof(int));
如果(!p)
goto first_标签;
int*q=malloc(sizeof(int));
if(!q)
转到第二个标签;
返回0;
第一个标签:
返回1;
}
第二个标签:
返回2;
}
使用以下配置:

---
Language:        Cpp
IndentGotoLabels: false
TabWidth: 4
...
运行
clangformat
将为我们提供:

int new_foo(){
{
int*p=malloc(sizeof(int));
如果(!p)
goto first_标签;
int*q=malloc(sizeof(int));
if(!q)
转到第二个标签;
返回0;
第一个标签:
返回1;
}
第二个标签:
返回2;
}
如果我们将
IndentGotoLabels
更改为
true
我们有:

int new_foo(){
{
int*p=malloc(sizeof(int));
如果(!p)
goto first_标签;
int*q=malloc(sizeof(int));
if(!q)
转到第二个标签;
返回0;
第一个标签:
返回1;
}
第二个标签:
返回2;
}
标签现在缩进,但与启动代码块的
{
处于同一级别,而不是代码本身

我不知道这是否是
clangformat
无法做到的,或者我缺少了一些选项。即使我的答案实际上没有解决问题,我也会将其公布。它可能会被证明是有用的

这也是文档中的行为,如果我们查看文档中的示例,那么可能没有办法更改它

这属于意见范围,但是
铿锵格式
有时会受到很大的限制。如果您可以自由使用另一个代码格式化程序,则可以使用
--缩进标签

初始答案:

.clang格式文件中将
IndentGotoLabels
设置为false。有关详细信息,请参阅

如果没有
.clang格式的文件,可以根据预定义的样式生成一个文件:

clang-format -style=llvm -dump-config > .clang-format

我问这个问题是因为我在文档中找不到答案。你不需要光顾。这似乎不起作用。你能给出一个更详细的例子吗?示例代码和配置?我认为它不能取消缩进已经缩进的标签(我现在无法检查)。我用
IndentGotoLabels
不起作用的方式更新了原始问题。我是btw版本10。对不起,我完全误解了这个问题。我编辑了我的答案,但看起来
clangformat
仍然不能满足您的需要(或者我找不到正确的选项).在回顾了clang format的源代码之后,我认为这是最好的答案。感谢您的
astyle
建议。