IT/에러

[에러] case 안에서 변수 선언 in C언어

KimCookieYa 2023. 6. 20. 15:55

발생

2023-06-20. Pint OS의 프로젝트 3. Anonymous Page 파트를 구현하다가 해당 에러가 발생했다. supplemental_page_table_copy() 함수 내에서 페이지 타입에 따라 처리를 해주기 위해 switch문을 사용하였는데 이때 case 안에서 변수를 선언한 것이 문제가 되었다.

평소 switch문을 쓸 때는 복잡한 구현을 할 일이 없어서 몰랐는데, 이번 기회에 알 수 있었다. 컴파일 버전에 따라 에러 여부가 갈리는 것 같다.

switch (type) {
    case VM_UNINIT:
        vm_initializer *init = src_page->uninit.init;
        void *aux = src_page->uninit.aux;
        vm_alloc_page_with_initializer (VM_ANON, upage, writable, init, aux);
        break;
    case VM_ANON:
    case VM_FILE:
        if (!vm_alloc_page (type, upage, writable)) {
            return false;
        }

        if (!vm_claim_page (upage)) {
            return false;
        }

        struct page *dst_page = spt_find_page (dst, upage);
        memcpy (dst_page->frame->kva, src_page->frame->kva, PGSIZE);
        break;
    default:
        return false;
}

솔루션

  • case 안에서 변수 선언하기
  • case에서 변수를 선언하려면 다음과 같이 {, }인 중괄호로 묶어주어야 한다.
  • Visual Studio 2017이나 Visual Studio 2015에서는 정상적으로 되지만 Visual Studio 2013이하 버전이나 GCC에서는 컴파일 에러가 발생한다고 한다.
switch (type) {
    case VM_UNINIT: {
        vm_initializer *init = src_page->uninit.init;
        void *aux = src_page->uninit.aux;
        vm_alloc_page_with_initializer (VM_ANON, upage, writable, init, aux);
        break;
    }
    case VM_ANON:
    case VM_FILE: {
        if (!vm_alloc_page (type, upage, writable)) {
            return false;
        }

        if (!vm_claim_page (upage)) {
            return false;
        }

        struct page *dst_page = spt_find_page (dst, upage);
        memcpy (dst_page->frame->kva, src_page->frame->kva, PGSIZE);
        break;
    }
    default: {
        return false;
    }
}

출처