2011-08-04 2 views
1

C 스위치에서 javas finally 절과 같은 것을 사용할 수 있습니다. 대부분의 사례에는 공통된 기능 세트가있어 하나의 사례를 넣고 싶습니다. 나는 고토 문을 사용하여 이것을 구현하려고 생각하고 있었고, gotos 코드 난독 화 능력을 잘 알고 있었고 switch 문 아래쪽에 공유 된 사례를 넣는 것은 공유 기능을 별도의 기능으로 분할하는 것보다 "깨끗한"방법으로 보인다. C 스위치 문의 마지막 절 (goto 사용 가능)

switch(x) { 
case 0: 
    printf("Case 0\n"); 
    goto case 2; 
    break; 
case 1: 
    printf("Case 1\n"); 
    goto case 2; 
    break; 
case 2: 
    printf("Case 2\n"); 
    break; 
default: 
    // do nothing 
    break; 
} 

그러나, GCC를 사용하여이 오류

error: expected identifier or ‘*’ before ‘case’ 

그것이 작동되도록하는 방법에 대한 어떤 제안을 실패

:

어쨌든, 나는이 같은 뭔가를 시도하고있다? 아니면 더 좋은 방법일까요?

답변

4

"모범 사례"는 물론 공유 코드를 함수에 위임하는 것입니다. 그러나이 overengineering, 또는 단순히 바람직하지/가능합니다 일부 상황에서, 당신은 할 수 있습니다 :

switch(x) 
{ 
case 0: 
    printf("Case 0\n"); 
    goto shared_material; 

case 1: 
    printf("Case 1\n"); 
    goto shared_material; // Unnecessary, but keep it for clarity. 

case 2: 
shared_material: 
    printf("Case 2\n"); 
    break; 

default: 
    // Write a meaningful error message somewhere 
    return -1; 
} 

나는이 너무 읽을 찾을 수없는, 나는 그것으로 문제가없는, 제공 전체 문장은 하나의 화면에 적합합니다 (그렇지 않으면 스파게티 코드). 그러나 코드 검토에서이 코드를 방어해야 할 수도 있습니다. 코드 검토에서 벗어나 코드를 다시 생각하는 주된 이유 중 하나입니다.

+0

글쎄,이게 작동합니다. 나는 case 문이 switch 문에서 내부적으로 레이블이라고 생각했습니다. – Kenneth

+0

@Kenneth : C가 아닙니다. C#에서는'case' 문을 쓰지 않기 때문에 C# (그리고 아마도 Java)에 있기 때문에'goto'를 사용합니다. C에서는'//코멘트를 통해 가을. –

+0

내부적으로 생성 된 코드에서 레이블처럼 작동하지만 구문 적으로 C에서는 작동하지 않습니다. –

2

뒤에 스위치를 입력하면 어떨까요? 그 것은 물론의 수,

switch(x) 
{ 
    case 0: 
     printf("Case 0\n"); 
     break; 

    case 1: 
     printf("Case 1\n"); 
     break; 

    case 2: 
     break; 

    default: 
     return -1; 
} 

printf("Common code for cases 0, 1 and 2\n"); 

또는 '기본'경우 플래그를 설정 :

나는 내가 기분이 하나 더 나은 디자인을 허용 대답을했다 지나친 의역이 회신을 업데이트해야 기분이 어떤 이유로 든 별도의 기능으로 나누기를 원하지 않는다면 공통 코드가 실행되는 것을 방지하십시오.

+0

나는 일부의 경우는 그 코드를 공유 할 필요가 있음을 언급하는 것을 잊었다. – Kenneth

+0

그렇다면 javas '_finally_ ;-)와 같이 작동하지 않습니다. 내 대답을 업데이트하여 의미를 나타냅니다. – Christoffer

+0

참. 마지막으로 예외에 대해서만 적용됩니다. 아마 원래의 질문을 다시 말해야합니다. – Kenneth

1

플래그 do2을 사용할 수 있습니다. 필요한 경우 설정하고 전환 후 확인하십시오.

계층 적 종속성이 더 복잡한 경우 전환으로 상태 시스템을 작성하십시오.

1

것은 차라리이 방법가는 것 :

void sharedFunction() { 
    printf("Case 2\n"); 
} 

switch(x) { 
case 0: 
    printf("Case 0\n"); 
    sharedFunction(); 
    break; 
case 1: 
    printf("Case 1\n"); 
    sharedFunction(); 
    break; 
case 2: 
    sharedFunction(); 
    break; 
default: 
    // do nothing 
    break; 
} 
+0

이것이 올바른 방법이라는 것을 알고 있지만,이 경우에는 공유 코드가 소수의 코드에 지나지 않기 때문에 혼란 스럽습니다. – Kenneth

+0

함수가 얼마나 짧을 지 제한이 없습니다. :) – Johan

+0

@Kenneth : 나도 좋아하지 않아. 지역 변수에 의존하는 공유 물건을 추가하려면,'sharedFunction'에 인수를 추가해야하고, 따라서 3 개의 다른 장소에서 코드를 변경해야합니다. 이 점에서 '고토 (goto)'접근법이 우월합니다. 깨끗한 솔루션은 가능한 한 '스위치'구조에서 벗어나야합니다. –

1

다음 작품 :

switch(x) { 
case 0: 
    printf("Case 0\n"); 
    if(0) 
case 1:{ 
    printf("Case 1\n"); 
    } 
case 2: 
    printf("Case 2\n"); 
    break; 
default: 
    // do nothing 
    break; 
} 
+1

나는 감동했다. 나는 이것을 결코 생각해 내지 못했을 것이고, 나는 이것을 포함하는 코드를 유지하는 것을 싫어할 것이다. 그러나 나는 그다지 덜 감동하지 않는다. – Kenneth

+0

@Kenneth, 모든'case' 문을'{}'에 래핑하는 것은 좋은 습관입니다 (여기서는 모두'{} '로 묶어야합니다). 내가하고있는 일은 단지'if (0)'을 넣는 것이다. 최소한 'goto'사용을 피하십시오. – iammilind

+0

그러나이 솔루션은 단일 사례 진술에만 적용됩니다. – Kenneth