【问题标题】:Moving left brace in C code to the next line?将 C 代码中的左大括号移动到下一行?
【发布时间】:2019-06-01 11:42:56
【问题描述】:

我有几个 C 源文件需要更改一个特定的格式化功能。在文件的某些部分,

if (x == NULL) {
    ...
}

需要改成

if (x == NULL)
{
    ...
}

我希望使用“缩进”命令,但它太激进了。它想用所有选项改变整个文件。

我想我可以在 Perl 甚至 Sed 中做到这一点,但我对这两者都不太了解。

【问题讨论】:

  • 使用sed 将在不了解c 语法的情况下完成此操作。这可能会导致进一步的问题。 Indent 是安全的选择。虽然一种方法是sed ' /if/ s/{$/\n&/g' 用于所有具有if 语句的行,或者只是sed ' s/{$/\n&/g' 用于所有行。确保在尝试这些命令之前保留文件的副本。
  • indent 的输出将是有效的 C 代码。你不能对任何给定的sedperl 命令的输出说同样的话。 indent 有很多选项-假设您的代码遵循一些约定(它应该),它们的某些组合将满足您的需要,因此您只需要告诉 indent 遵循哪些约定以不修改已经遵循这些约定的其余代码。
  • 为什么要改?
  • @EdMorton "indent 的输出将是有效的 C 代码。" 哈哈,不。 indent 也没有真正解析 C。您总是需要手动检查结果。
  • @melpomene 谢谢你的例子,但说真的,如果你写了,那么你应该让它休息。

标签: c perl sed indentation


【解决方案1】:

这是怎么回事?

$ cat tst.c
#include "stdio.h"

int
main ()
{
    void *x;

    if (x == NULL) {
        printf("darn\n");
    }

    return 0;
}

.

$ indent -i 4 -bli 0 -npcs -st tst.c
#include "stdio.h"

int
main()
{
    void *x;

    if (x == NULL)
    {
        printf("darn\n");
    }

    return 0;
}

如果您有其他不应更改的代码段示例,则创建一个包含这些示例程序并调整indent 选项,直到您满意它输出的代码样式是您想要的样式。


@melpomene had mentioned 的评论中,indent 并不总是正确处理混淆代码,并给出了prin\<newline>tf("...") 的示例。 idk 关于其他情况,但您可以在 sed 和 gcc 的帮助下通过预处理来处理该情况:

$ cat tst.c
#include "stdio.h"

int
main ()
{
    void *x;

    // here is a comment
    if (x == NULL) {
        prin\
tf("darn\n");
    }

    return 0;
}

.

$ indent -i 4 -bli 0 -npcs -st tst.c
#include "stdio.h"

int
main()
{
    void *x;

    // here is a comment
    if (x == NULL)
    {
        prin tf("darn\n");
    }

    return 0;
}

.

$ sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' tst.c |
    gcc -CC -P -traditional-cpp -E - |
    sed 's/aC/#/g;s/aB/__/g;s/aA/a/g'
#include "stdio.h"

int
main ()
{
    void *x;

    // here is a comment
    if (x == NULL) {
        printf("darn\n");
    }

    return 0;
}

.

$ sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' tst.c |
    gcc -CC -P -traditional-cpp -E - |
    sed 's/aC/#/g;s/aB/__/g;s/aA/a/g' |
    indent -i 4 -bli 0 -npcs -st
#include "stdio.h"

int
main()
{
    void *x;

    // here is a comment
    if (x == NULL)
    {
        printf("darn\n");
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    看来今天是我的幸运日,看来我想通了:

    sed 's/^\([ ]*\)\(if (.* == NULL)\) {$/\1\2\n\1{/g' <filename>
    

    有人可以确认这是正确的吗?

    【讨论】:

    • 我可以确认它不完整。
    • 我也可以确认它是不正确的,它的任何变体都不会是正确的。
    • 不,给定一个特定的样本输入,它会产生预期的输出。这是确定解决方案的起点,而不是终点。作为输入的一个简单示例,它不适用于 try printf '// if (x == NULL) {\nif (x == 0) {\n' | sed 'script',它将生成包含语法错误(不匹配的 {)的 C 代码。
    • 没有。您无法使用 sed 或任何其他不了解 C 语言的工具稳健地完成这项工作。你想出的任何表达式都会有失败的情况。
    • 这对于 OP 来说可能没问题,因为他们的代码库是有限的,而且任务是一次性任务。
    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2019-10-27
    • 2021-02-26
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多