IT TIP

C 코드 블록을 중괄호로 묶는 이유는 무엇입니까?

itqueen 2020. 11. 29. 12:49
반응형

C 코드 블록을 중괄호로 묶는 이유는 무엇입니까?


나는 C 코드를보고 있는데, 어떤 종류의 제어 구조도없이 코드 블록을 둘러싸는 중괄호로 가득 차 있다는 것을 알았습니다. 한 번보세요 :

//do some stuff . . .
fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
{
    //a block! why not?
    char *tmp_argv[3];
    tmp_argv[0] = argv[0]; tmp_argv[1] = str; tmp_argv[2] = prefix;
    t = clock();
    fprintf(stderr, "[bwa_index] Convert nucleotide PAC to color PAC... ");
    bwa_pac2cspac(3, tmp_argv);
    fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}

코드에 이와 같은 블록을 삽입하는 이유는 무엇입니까? 그것들로 가득 차 있습니다. 어떤 종류의 성능 이점이 있습니까? 신비한 C 것? 왜???

편집 : 이 코드는 BWA 에서 나온 경우, 궁금한 사람이있을 경우 Burrows-Wheeler 변환을 사용하여 작은 시퀀스를 큰 참조 시퀀스로 정렬하는 생물 정보학 프로그램입니다 . 이 코드 예제는 응용 프로그램의 기능과 특별히 관련이 없습니다.


선언을 수행하려면 {}이 (가) 필요한 레거시 코드

C89에서는 int i;아무데서나 할 수 없었습니다 . 선언은 블록의 시작 부분에서만 유효했습니다.

그래서:

a = 1;
int i; /* error */
i = 2;

... 유효하지 않았지만

a = 1
if (e) {
  int i;

... 평범한 블록처럼 괜찮 았습니다.

결과 스타일은 선언이 유효해진 후에도 (C99) 블록 항목 (들), 부분적으로는 관성, 부분적으로는 역방향 이식성 및 새 선언의 범위를 설정하는 것이 합리적이기 때문에 계속되었습니다.


변수 범위를 지정합니다. 예를 들어 변수 tmp_argv는 중괄호 사이에서만 유효합니다.


블록은 변수의 수명과 컴파일러에 대한 가시성을 결정하는 범위입니다. 따라서 블록 내에서 생성 된 변수는 제어가 블록을 벗어날 때 사라집니다.

이러한 변수가 생성자와 소멸자가있는 클래스의 인스턴스 일 때 매우 편리 할 수 ​​있습니다.

그러나 귀하의 예에는 많은 이점이 없습니다.


최근에 발견 한 또 다른 사용 사례는 열기 / 닫기 시맨틱이 있고 '내부'코드를 명확하게 표시하려는 경우입니다.

f = fopen('file');
{
    // do stuff
}
fclose(f);

이것은 객체를 닫거나 해제하도록 상기시키는 데 효과적이며 코드를 다소 깔끔하게 만듭니다.


범위를 만들고 있습니다. 스택 개체는 범위를 벗어나면 파괴됩니다. 일종의 타이핑을하는 것 같습니다. 즉, 각 블록이 시간을 정하고 싶었던 것입니다. 그러나 범위가 지정된 타이머 개체가 표시되지 않으므로 말이되지 않습니다.


블록 내에서 선언하는 변수는 해당 블록에 국한됩니다. 이렇게하면 tmp_argv이 코드 조각과 충돌하지 않고 코드의 다른 위치 (아래)에서 재정의 할 수 있습니다 .


그게 다야? 프로그래머가 tmp_argv코드의 다른 곳에서 사용하고 있을 수 있습니다. tmp_argv사이 가 중괄호 외부 {}분리되어 있기 때문에 다른 이유는 생각할 수 없습니다 .


나는 때때로 다음과 같은 경우에 블록을 사용합니다.-변수를 지역화하거나 읽기 쉽게 ...


흠-여기 차트에서 벗어 났을 수도 있지만 그러한 블록 내부의 지역 변수 정의는 블록 외부에서 유효하지 않을 것이라고 생각합니다

참고 URL : https://stackoverflow.com/questions/1677778/why-enclose-blocks-of-c-code-in-curly-braces

반응형