2011년8월23일_C언어_continue, do-while, label과 goto문, 조건부컴파일(#if, #else, #elif, #ifdef, #ifndef, #endif, #undef), 매크로함수



● continue문

자세한 설명은 생략... for문 안에서 실행되면 증감식을 실행하고 for문의 시작으로 돌아감. 물론 조건식도 검사하겠지..



● do-while문

자세한 설명은 생략...while문과 같으나 조건식을 먼저 검사하지 않고 무조건 한 번은 내부 명령문들이 실행되고 마지막에 검사한다.



● label과 goto문

   1: TEST:        //다음에 오는 printf()의 주소(CODE)
   2:     printf("하하하\n");
   3:     goto TEST    //TEST라벨로 점프한다.

goto문은 어셈블리 명령어 중 jmp와 같이 무조건 그 주소로 분기하는 명령이다.



● 조건부컴파일

1) #if-#endif문

   1: #define    DEBUG    1
   2: #if    (1 == DEBUG)    
   3: //디버그 코드들
   4: #endif

개발단계에서 테스트를 위해 DEBUG값을 1로 설정해 놓고 코드 사이사이에 #if-#endif문을 넣어 놓으면,
디버그코드들이 컴파일되어 동작하고,
DEBUG값을 0으로 해놓으면,
디버그코드들은 컴파일이 되지 않아 동작하지 않는다.
이렇게 릴리즈시에 소스코드를 수정하지 않고 편하게 원하는 결과를 얻을 수 있다.



2) #elif문 (today_ifdef/elif.c)

   1: //임베디드C p.382 #elif문 (조건부컴파일)
   2: #include <stdio.h>
   3:  
   4: #define    SMALL    10
   5: #define    LARGE    50
   6: #define    HUGE    100
   7: //#define    SIZE    SMALL
   8:  
   9: int main()
  10: {
  11: #if    (SIZE == SMALL)
  12:     int list[SMALL];
  13: #elif (SIZE == LARGE)
  14:     int list[LARGE];
  15: #elif (SIZE == HUGE)
  16:     int list[HUGE];
  17: #endif
  18:  
  19:     printf("list배열의 크기는 %d\n", sizeof(list));
  20:  
  21:     return 0;
  22: }

상기의 소스코드에서 주석처리된 #define을 주석제거하고 SMALL을 LARGE나 HUGE로 바꾸면 아래와 같이,

image  


<- SMALL일 때


<- LARGE일 때



<- HUGE일 때

(gcc컴파일 -D옵션으로 SIZE를 정의해도 됩니다.)



3) #ifdef, #ifndef, #endif  (today_ifdef/ifdef.c) 

   1: #include <stdio.h>
   2:  
   3: #define    SIZE    
   4:  
   5: int main()
   6: {
   7: #ifdef    SIZE
   8:     printf("array size is defined.\n");
   9: #else
  10:     printf("array size is undefined.\n");
  11: #endif
  12:  
  13:     return 0;
  14: }
  15:     

#define으로 SIZE를 정의할 때 값을 넣지 않아도 아래의 #ifdef문이 동작하여 컴파일된다.


image



4) 매크로 함수 (today_ifdef/macro.c)

   1: #include <stdio.h>
   2:  
   3: #define    CUBE(x)        ((x) * (x) * (x))
   4: #define    SUM(x, y)    ((x) + (y))
   5:  
   6: int main()
   7: {
   8:     int a, b, c;
   9:  
  10:     a = 3;
  11:     b = CUBE(a);
  12:     c = SUM(3, 4);
  13:  
  14:     printf("The cube of %d is %d.\n", a, b);
  15:     printf("3과 4의 합은 %d\n", c);
  16:  
  17:     return 0;
  18: }


image





★ 매크로와 일반함수의 차이점

  매크로 함수
코드사이즈 쓸수록 많아짐. 많이 사용해도 호출문+@만 는다.
실행속도 빠르다. 느리다.




5) #undef (today_ifdef/undef.c)

   1: #include <stdio.h>
   2:  
   3: int main()
   4: {
   5:     float area1;
   6:     float area2;
   7:     
   8: #define    PI    3.1416
   9:     area1 = 5 * 5 * PI;
  10: #undef    PI
  11: #define    PI    3.14
  12:     area2 = 5 * 5 * PI;
  13:  
  14:     printf("area1 = %f\n", area1);
  15:     printf("area2 = %f\n", area2);
  16:  
  17:     return 0;
  18: }
  19:     


image





참조(Reference)




DSCN3985 DSCN3986 DSCN3987 DSCN3980 DSCN3981 DSCN3982 DSCN3983 DSCN3984