GNU 들여쓰기가 한 수준의 들여쓰기를 축소하는 이유는 무엇입니까?

GNU 들여쓰기가 한 수준의 들여쓰기를 축소하는 이유는 무엇입니까?

다음을 사용하여 C 코드의 형식을 지정하려고 할 때GNU 들여쓰기, 여러 수준의 중첩된 들여쓰기를 처리하지 못하는 것 같습니다. 구체적으로는 들여쓰기 2단계가 무너지는 것 같습니다.

예를 들어, 이것이 내가 시작하는 코드라면:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int n;

    if (argc > 1) {
        printf("# of args: %d\n", argc);
    }

    for (n = 1; n <= 15; n++) {
        if (n % 3 == 0) {
            printf("fizz %d\n", n);
        } else if (n % 5 == 0) {
            printf("buzz %d\n", n);
        } else if (n % 3 == 0 && n % 5 == 0) {
            printf("fizzbuzz %d\n", n);
        } else {
            printf("%d\n", n);
        }
    }

    return 0;
}

를 실행하면 indent -kr fizzbuzz.c다음과 같은 결과를 얻습니다.

#include <stdio.h>

int main(int argc, char *argv[])
{
    int n;

    if (argc > 1) {
    printf("# of args: %d\n", argc);
    }

    for (n = 1; n <= 15; n++) {
    if (n % 3 == 0) {
        printf("fizz %d\n", n);
    } else if (n % 5 == 0) {
        printf("buzz %d\n", n);
    } else if (n % 3 == 0 && n % 5 == 0) {
        printf("fizzbuzz %d\n", n);
    } else {
        printf("%d\n", n);
    }
    }

    return 0;
}

indent fizzbuzz.c기본값()으로 실행 하면 다음과 같은 결과가 나타납니다.

#include <stdio.h>

int
main (int argc, char *argv[])
{
  int n;

  if (argc > 1)
    {
      printf ("# of args: %d\n", argc);
    }

  for (n = 1; n <= 15; n++)
    {
      if (n % 3 == 0)
    {
      printf ("fizz %d\n", n);
    }
      else if (n % 5 == 0)
    {
      printf ("buzz %d\n", n);
    }
      else if (n % 3 == 0 && n % 5 == 0)
    {
      printf ("fizzbuzz %d\n", n);
    }
      else
    {
      printf ("%d\n", n);
    }
    }

  return 0;
}

많은 사람들이 그것이 상자에서 나온 것인지 물어볼 것 같습니다. 버그가 아니라면 코드 형식을 지정하는 매우 이상한 방법처럼 보이기 때문입니다. 왜 이런 일을 하는가?

저는 GNU Indent 버전 2.2.11을 사용하고 있습니다.

답변1

들여쓰기에는 공백과 탭(공백 8개)을 혼합하여 사용합니다. 다음과 같은 최소한의 예를 통해 이를 확인할 수 있습니다.

int main() {
    if (true) {
        while (false) {
            puts("");
        }
    }
}

다시 실행하면 indent -kr다음 hexdump -C과 같은 결과가 나타납니다.

$ indent -kr < mini.c |hexdump -C
00000000  69 6e 74 20 6d 61 69 6e  28 29 0a 7b 0a 20 20 20  |int main().{.   |
00000010  20 69 66 20 28 74 72 75  65 29 20 7b 0a 09 77 68  | if (true) {..wh|
00000020  69 6c 65 20 28 66 61 6c  73 65 29 20 7b 0a 09 20  |ile (false) {.. |
00000030  20 20 20 70 75 74 73 28  22 22 29 3b 0a 09 7d 0a  |   puts("");..}.|
00000040  20 20 20 20 7d 0a 7d 0a                           |    }.}.|
00000048

앞에 (가로 탭) 바이트 while가 있고 , 앞에 탭과 4개의 공백( )이 있는 것을 볼 수 있습니다 . 기본값은 다음과 유사합니다.09puts20

00000000  69 6e 74 0a 6d 61 69 6e  20 28 29 0a 7b 0a 20 20  |int.main ().{.  |
00000010  69 66 20 28 74 72 75 65  29 0a 20 20 20 20 7b 0a  |if (true).    {.|
00000020  20 20 20 20 20 20 77 68  69 6c 65 20 28 66 61 6c  |      while (fal|
00000030  73 65 29 0a 09 7b 0a 09  20 20 70 75 74 73 20 28  |se)..{..  puts (|
00000040  22 22 29 3b 0a 09 7d 0a  20 20 20 20 7d 0a 7d 0a  |"");..}.    }.}.|
00000050

여기에는 가장 안쪽 버팀대가 있고 puts탭이 있습니다.

-nut/ 옵션 --no-tabs을 사용하면 어디에서나 공백을 사용할 수 있습니다 .

$ indent -kr -nut fizzbuzz.c

또는 원래 들여쓰기를 유지하는 것이 중요한 경우 4개가 아닌 8개의 넓은 탭을 사용하도록 편집기 및/또는 터미널을 구성할 수 있습니다. 이 expand명령은 다시 들여쓰지 않으려는 기존 파일을 변환하는 데 도움이 될 수 있습니다.

관련 정보