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로 바꾸면 아래와 같이,
<- 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문이 동작하여 컴파일된다.
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: }
매크로 | 함수 | |
코드사이즈 | 쓸수록 많아짐. | 많이 사용해도 호출문+@만 는다. |
실행속도 | 빠르다. | 느리다. |
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:
참조(Reference) |