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
'IT TIP' 카테고리의 다른 글
동일한 Xcode 프로젝트에서 Swift, Objective-C, C 및 C ++ 파일을 가질 수 있습니까? (0) | 2020.11.30 |
---|---|
MySQL SELECT를 사용하여 가상 열을 만드는 방법은 무엇입니까? (0) | 2020.11.29 |
모델이 새 것인지 아닌지 어떻게 알 수 있습니까? (0) | 2020.11.29 |
정규식까지만 포함되지 않음 (0) | 2020.11.29 |
콘텐츠 언어 용 HTML 메타 태그 (0) | 2020.11.29 |