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;
}
}