注释掉多行打印语句的快速简便的方法

注释掉多行打印语句的快速简便的方法

有没有一种快速简便的方法来注释掉多行打印语句?像这样的东西?

                printf("3387 strings_line_tokens[lower_bound_of_big_boy_counter] %s \n", 
                strings_line_tokens[lower_bound_of_big_boy_counter]);

我主要有三种,还有零星的第四种。

            printf("3402 checking return stuff \n");
            printf("3408 strings_line_tokens[lower_bound_of_big_boy_counter] %s \n", 
            strings_line_tokens[lower_bound_of_big_boy_counter]);
            printf("3410 function_type_for_proper_return %s \n", function_type_for_proper_return);

这是我零星的第四个。有时,这%c对于找出 if 语句或 while 循环未按预期运行的原因很有用。

        printf("2340 symbol_table_variables[i][1] is %s.\n", symbol_table_variables[i][1]);
        printf("2341 symbol_table_variables[i][2] is %c.\n", symbol_table_variables[i][2][0]);

请再复杂一点:)。是否可以单独保留这两种类型的打印语句?

        printf("2434 REJECT\n");
        printf("2534 ACCEPT\n");

答案1

说“处理以下成员”是没有意义的以一种方式分组,并处理 这另一组换一种方式。”您应该指定一个组以一种方式处理,并规定其他所有内容都以另一种方式处理。所以我假设你想要全部 printf注释掉的语句除外,类似于以下之一的语句:

        printf("2434 REJECT\n");
        printf("2534 ACCEPT\n");

因此,这里有一个“简单”的解决方案:

awk '
        /printf/        { comment=1 }
        /printf\("[0-9]* REJECT/    { comment=0 }
        /printf\("[0-9]* ACCEPT/    { comment=0 }
                        { if (comment) printf "//"
                          print }
        /;/             { comment=0 }
'

它的作用如下:

  • 每当它看到包含 的行时printf,它就会设置comment标志。 (请注意,这将匹配对fprintf和 的调用sprintf调用。它还将匹配评论字符串包含这个词printf;例如,
            /* 这个 printf 用于弄清楚 if 语句正在做什么。 */
    如果您需要更具体,请调整它。)
  • 然后,如果发现它是printf一串数字,后面跟一个空格,后面跟REJECTACCEPT,那么它就变成离开comment,因为您不希望这些语句被注释掉。请注意,这些正则表达式有点宽泛——它们会接受任何数字数字(不仅仅是四个),并且它们不检查该单词是否是该行的最后一个。如果您需要更具体,请调整它们。
  • 然后它为每一行输入执行一个两行代码块:
    • 如果comment设置了该标志,则会写出//, 以注释掉该行。请注意awk,与 C 中一样, inprintf不会自动写入换行符。
    • 然后,对于每一行,它都会写入该行。 (在awk里面print声明自动在末尾写入换行符;默认是将输入行写入输出。)因此,这会将输入行写入输出,并用//if it is (part of) a printfstatements(而不是特殊情况之一)进行注释。
  • 然后,如果它看到一个分号,它就会关闭该comment标志。这允许在处理comment多行语句时标志保持设置状态。printf这就是为什么字符串printf中不包含分号很重要,因为该awk脚本会将分号误认为是语句的结尾。

例如,对于输入

    cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
    printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
    printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
        strings_line_tokens[lower_bound_of_big_boy_counter]);
    if (cmp_str9 == 0)
    {
        printf("2534 ACCEPT\n");
        printf("3402 checking return stuff\n");
        return_match_flag = 1;
    }

产生这个输出

    cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
//    printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
//    printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
//        strings_line_tokens[lower_bound_of_big_boy_counter]);
    if (cmp_str9 == 0)
    {
        printf("2534 ACCEPT\n");
//        printf("3402 checking return stuff\n");
        return_match_flag = 1;
    }

您没有准确描述您想要的输出。放在//每行的开头是注释代码的简单方法。您可能更喜欢将其放在/*第一行之前和*/最后一行之后。我建议不要在自动化脚本中执行此操作,因为/*…*/注释掉的代码中的任何样式注释都会结束注释(因为/*…*/样式注释不会嵌套)。当然可以寻找 */在注释掉的代码中,但这会变得混乱。

但还有另一种方法可以注释掉 C 代码块。任何介于

#if 0

#endif

就编译器而言,它基本上从源代码文件中消失了。虽然这会爆炸,如果重叠 与任何其他预处理器 ( #…) 块一起,它确实可以很好地嵌套。我们#if 0之前可以写每一个 printf语句,以及#endif之后,但我认为检测打印语句块会更好。所以我想出了这个:

awk '
        /printf/        { starting_comment=1 }
        /printf\("[0-9]* REJECT/    { starting_comment=0 }
        /printf\("[0-9]* ACCEPT/    { starting_comment=0 }
                        { if (starting_comment) {
                                starting_comment=0
                                if (in_a_comment==0) print "#if 0"
                                in_a_comment=1
                          }
                          if (in_a_comment==2) {
                                print "#endif"
                                in_a_comment=0
                          }
                          print
                        }
        /;/             { if (in_a_comment==1) {
                                in_a_comment=2
                          }
                        }
        END             {
                          if (in_a_comment==2) {
                                print "#endif"
                                in_a_comment=0
                          }
                        }
'

您可能并不真正需要该END块;仅当输入中的最后一行是语句时它才起作用printf。当然,C 源代码文件中的最后一行应该始终是}.

对于上面显示的示例输入,这会产生

    cmp_str9 = strcmp("return", strings_line_tokens[lower_bound_of_big_boy_counter]);
#if 0
    printf("4006 lower_bound_of_big_boy_counter %d\n", lower_bound_of_big_boy_counter);
    printf("4007 strings_line_tokens[lower_bound_of_big_boy_counter] %s\n",
        strings_line_tokens[lower_bound_of_big_boy_counter]);
#endif
    if (cmp_str9 == 0)
    {
        printf("2534 ACCEPT\n");
#if 0
        printf("3402 checking return stuff\n");
#endif
        return_match_flag = 1;
    }

请注意前两个printf语句如何组合成一个块。

相关内容