본문 바로가기
3. 개발 관련/공부 :: c

fallthrough in C (statement attribute)

by kyuho.choi 2023. 5. 8.
728x90
반응형

kernel driver code 를 보다 오랫만에 보는 문법이 반가워 정리해본다.

 

제목 그대로 switch-case 에서 fallthough를 지정하는 부분인데, 이전에는 무쓸모라고 막연히 생각하였다(그냥 break를 안쓰면 되니까..)

 

근래에 들어서는 code review 기반에서 괜찮은 attribute 사용방법으로 생각되었다.

 

switch-case 에서 break missing 이 아닌 의도한 코드임을 알려줄 수 있으니,다른 사람이 쉽게 인지할 수 있는 문법으로 사용가능하겠구나 정도...

 

__attribute__((fallthrough)); // GNU C
[[fallthrough]]; // C17,C23
[[clang::fallthrough]]; // clang
#include <stdbool.h>
 
void g(void) {}
void h(void) {}
void i(void) {}
 
void f(int n) {
  switch  (n) {
    case 1:
    case 2:
          g();
          printf("?????? \n");
          __attribute__((fallthrough)); // 다음 case 까지 코드가 수행되도록
                                        // falthrough 를 걸어 준다.
    case 3: 
          h();
          printf("!!!! \n"); // 당연히 여기까지 수행
          break;
    case 4: 
          if(n < 3) {
              i();
          } else {
              return;
          }
          break;
    default:
          break;
  
  }
}
 
int main(void) {
    f(2);
}

 

실행 결과는 아래와 같다.

?????? 
!!!!

 

kernel driver 코드에서는 아래와 같이 사용, fallthough 를 별도의 attribute 등의 지정 없이 그냥 써주면 된다.

 

 
void g(void) {}
void h(void) {}
void i(void) {}
 
void f(int n) {
  switch  (n) {
    case 1:
    case 2:
          g();
          printf("?????? \n");
          fallthrough; // 다음 case 까지 코드가 수행되도록
                                        // falthrough 를 걸어 준다.
    case 3: 
          h();
          printf("!!!! \n"); // 당연히 여기까지 수행
          break;
    case 4: 
          if(n < 3) {
              i();
          } else {
              return;
          }
          break;
    default:
          break;
  
  }
}
728x90
반응형

댓글