여러 줄의 인쇄 문을 주석 처리하는 빠르고 쉬운 방법

여러 줄의 인쇄 문을 주석 처리하는 빠르고 쉬운 방법

여러 줄의 인쇄 문을 주석 처리하는 빠르고 쉬운 방법이 있습니까? 이 같은?

                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);

이번이 네 번째 산발적 사건이다. 때로는 %cif 문이나 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 }
'

그 기능은 다음과 같습니다.

  • 포함된 line 을 볼 때마다 플래그를 printf설정합니다 . comment(이것은 fprintf및 에 대한 통화 호출 과 일치합니다 sprintf. 또한 일치합니다.논평그리고printf예를 들어 ;라는 단어가 포함되어 있습니다 .
            /* 이 printf는 if 문이 무엇을 하는지 알아내는 데 사용됩니다. */
    좀 더 구체적으로 작성해야 하는 경우 조정하세요. )
  • printf그런 다음 숫자 문자열과 공백, REJECTor ACCEPT가 뒤따르는 것으로 밝혀지면떠나다이는 comment이러한 명령문이 주석 처리되는 것을 원하지 않기 때문입니다. 이 정규 표현식은 약간 광범위하다는 점에 유의하세요.임의의 숫자숫자(단지 4개가 아님)를 입력하고 해당 단어가 줄의 마지막 단어인지 확인하지 않습니다. 좀 더 구체적으로 설명해야 하는 경우 조정하세요.
  • 그런 다음 각 입력 줄에 대해 두 줄의 코드 블록을 실행합니다.
    • 이 플래그가 설정 되면 행을 주석 처리하기 위해 가 comment기록됩니다 . C에서와 마찬가지로 in은 //자동 으로 개행 문자를 쓰지 않습니다.awkprintf
    • 그런 다음 각 행에 대해 해당 행을 씁니다. ( awkprint명시됨하다끝에 개행 문자를 자동으로 씁니다. 기본값은 입력 줄을 출력에 쓰는 것입니다. ) 따라서 이것은 입력 라인을 출력에 기록하고 (특수 사례 중 하나가 아닌) 명령문 //의 일부인 경우 주석을 달습니다.printf
  • 그런 다음 세미콜론이 보이면 플래그를 끕니다 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처음 두 명령문이 어떻게 블록으로 결합되는지 확인하세요 .

관련 정보