다음을 사용하여 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개의 공백( )이 있는 것을 볼 수 있습니다 . 기본값은 다음과 유사합니다.09
puts
20
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
명령은 다시 들여쓰지 않으려는 기존 파일을 변환하는 데 도움이 될 수 있습니다.